みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++で>>演算子のオーバーロード

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;
}
どなたか答えて頂けると有難いです。

投稿日時 - 2017-05-22 12:12:53

QNo.9332142

困ってます

質問者が選んだベストアンサー

>わからないのは s = temp; の部分です。

「暗黙の型変換」が行われています。

代入の直前の時点で「暗黙的な無名」のStringオブジェクトのインスタンスが生成されます。

生成時、コンストラクタには「char *temp」が渡され、暗黙的な無名のStringオブジェクトの内容は「tempが指す文字列」になります。

次に「tempと同じ内容を持つ、無名のStringオブジェクトの値が、Stringオブジェクトのsに代入される」のです。

そして、代入が終わると「無名のStringオブジェクト」が自動的に破棄されます。

投稿日時 - 2017-05-22 13:58:25

お礼

早速に回答を頂き、有難うございます。
「暗黙的な無名」のオブジェクトはまだ知りませんでした。
教本が進むと出てくるのかもしれません。
納得のいく説明、本当に有難うございました。

投稿日時 - 2017-05-22 15:13:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問