- ベストアンサー
&は参照という言葉を知っていますが、イメージがわきません。
最近、演算子のオーバロードを覚えたのですが、String&の&は何を意味するのでしょうか? *thisは、クラスの実体?を返しているということでしょうか? 厳密に知りたいのです。 ●正しく動作 String& String::operator += (String& p){ String temp(s); len = len + p.len; delete s; s = new char [ len + 1 ]; strcpy( s, temp.get() ); strcat( s, p.s ); return *this; } ×正しく動作せず String& String::operator += (String& p){ String temp; len = len + p.len; char* t = new char [ len + 1 ]; strcpy( t, s ); strcat( t, p.s ); temp.set( t ) ; delete [len]t; return temp; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
素人が超適当に説明すると 参照とは「別名のようなもの」ですな int a = 10; int& b = a; とすると、最初実体 10 の変数として a が宣言され、プログラム中では a という名前を通じて 10 にアクセスできるわけですな。 次に、b という「a の別名」が宣言されて、プログラム中で b という名前を使っても 10 にアクセスできるようになったわけです。 んで、String& operator +=(String& p); ですが。これは String foo("foo"); String bar("bar"); String baz("baz"); foo += bar += baz; のような使用を想定しているのですな。 引数 p は「参照渡し」をしているので、foo += bar ( foo.operator+=(bar) ) とした時に、bar が p にコピーされるのではなく、bar が保持しているオブジェクトの別名 p が作成されて、関数内で使用されます。 関数から制御が戻るときも同様に、*this ( つまり foo ) のコピーが戻されるのではなく、foo.operator+=(bar) が foo の別名として機能するということです。 当然それは関数のスコープを抜けても有効なオブジェクトでなければいけません。というので後半に書いたコードは破棄されたオブジェクト temp の別名を作ろうとして失敗します。
その他の回答 (1)
- crew21
- ベストアンサー率26% (58/222)
No.1さんは素人さんだそうですが、すごく的確で簡明な説明をしてると思います。 そう、まさに参照とは「別名のようなもの」です。ていうか別名です。クローンて言う人もいますな。 細かな数式はNo.1さんが書かれているので省いて、ここではたとえ話をするけど、メモリ上に確保された 10 という値を持つエリア。 このエリアに付けられた(変数)名が a だとしましょう。 でも、他にも b とか c とかの別名をつけて、それを通して a の中身、即ち 10 を参照したり変更できる。これが参照です。 まあアレですよ。 メモリ上に確保された 10 という値を持つエリアを夫とするなら、a は正妻(昔風なら正室)、b とか c は愛人、二号さん(昔風なら側室)て感じかな。 ちょっと話が横ズレしてきたけど、正妻からでも二号さんからでも夫に何かを伝えたり様子を訊くことはできるわけで、そういうことですよ。 あーなんかヤバかったかな。