- ベストアンサー
C++のoperator +()について
- C++のoperator +()についての質問です。文字列クラスを作る場合、delete[] strを確認する方法を教えてください。
- C++のoperator +()を使って文字列クラスを作成していますが、デストラクタでdelete[] strが正しく呼び出されているか不安です。
- C++のoperator +()を使用して文字列クラスを作成しましたが、スペースも含めた結合ができるようにしたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
前の投稿も拝見しましたが、少々泥沼にはまっている感じがします。 そもそも、なぜデストラクタで場合分けする自体に成っているかを考える必要があると思います。 stt A, B; と在る時に A.str != B.str であれば必要ないですよね? 代入(A = B;) した時は A.str == B.str と成らない様 operator = をオーバーロードしていますね? しかし、何処かでA.str = B.str と成ってしまっているのです。 何処かと言うとコンストラクタによって初期化される所で A.str = B.str と成っています。 stt::stt() でそんな処理はしていないぞ、と思うかも知れませんが それはその通り、stt::stt(stt& B)を呼び出した時にA.str = B.strと成っています。 stt::stt(stt& B)はコピーコンストラクタと呼ばれるもので、 同じ型で変数を初期化するとき (例 stt A(B); stt A = B;) stt形の引数を持つ関数を呼ぶとき (例 func(stt A); を呼ぶとき) stt形を返す関数から戻るとき (例 stt func(); からreturnするとき (return B; とした所でコピーコンストラクタが呼ばれる)) などに呼び出されます。 ※参照を引数にするときや参照を返すとき(func(stt& A); stt& func();)は呼ばれません。 operator = をオーバーロードしているという事はそうしないと A = B;とした時に A.len = B.len; A.str = B.str; A.maked; = B.maked; となってしまう事は存じていると思いますが、 stt::stt(stt& B)も特に書いていない状態だとメンバー変数を単純にコピーする動作 A.len = B.len; A.str = B.str; A.maked; = B.maked; が行われます。 問題のプログラムでは stt operator +(stt ste) を呼び出すときと帰る時に stt::stt(stt& B)が呼び出されています。
お礼
イメージとしては、ぼんやりですが、 いろいろ練習していきたいと思います。 ありがとうございました。