※ ChatGPTを利用し、要約された質問です(原文:C++で>>演算子のオーバーロード)
C++で>>演算子のオーバーロードについて
このQ&Aのポイント
C++学習者が現在Stringクラスを作成し、演算子のオーバーロードを定義しているが、友達関数として定義されている入力演算子(>>)の一部が理解できない
友達関数として定義された入力演算子(>>)について、なぜ単なる文字列をStringクラスのオブジェクトに代入できるのか疑問がある
代入演算子(=)のオーバーロード関数においても、単なる文字列をStringクラスのオブジェクトに代入できないように見える
C++学習者です。
Visual Studio Community 上で、ある教本を使って勉強しています。
現在Stringというクラスを作って、文字列に対して連結や部分文字列の取り出しなどができるようにするための色々な演算子のオーバーロードをする関数を定義していますが、疑問点がありますので、お聞きしたいと思います。
Stringクラスのプライベート変数は、文字列の長さを表すlength と、new 演算子で動的に確保するメモリー領域の始まりのアドレスを表す *sPtr の二つです。
クラス内ではパブリックなメンバー関数としていろいろな演算子がオーバーロードされていて、これらについてはよく理解できるのですが、friend 関数として定義されている入力演算子(>>)について納得がいかない部分があります。
その関数は次のようになっています。
istream &operator>>(istream &input, String &s)
{
char temp[100];
input >> setw(100) >> temp;
s = temp;
return input;
}
わからないのは s = temp; の部分です。
sはStringクラスのオブジェクトで、temp は単なる文字列なのに、なぜ代入できるのでしょうか?
代入演算子=のオーバーロード関数も下に挙げますが、この中でも単なる文字列をStringクラスのオブジェクトに代入できるようにはなってないように見えます。
const String &String::operator=(const String &right)
{
if (&right != this){ // avoid assignment of itself
delete [ ] sPtr;
length = right.length;
sPtr = new char[ length + 1];
strcpy(sPtr, right.sPtr);
}
else cout<< "attempted to assign a String to itself \n\n";
return *this;
}
どなたか答えて頂けると有難いです。
お礼
早速に回答を頂き、有難うございます。 「暗黙的な無名」のオブジェクトはまだ知りませんでした。 教本が進むと出てくるのかもしれません。 納得のいく説明、本当に有難うございました。