49788


コピーコンストラクタと代入コンストラクタのコードなのですが  
二つの最初のif文の`if(&x == this)`や`if(&x != this)`などはどのような意味なのでしょうか？ コピーの`if(&x ==
this)`がtrueの時と `if(&x != this)`falseの時はその後の処理はどうなるのでしょうか？  
１(例)`a.operator(b);`と解釈されるのでthisはbなのでしょうか？  
２`a = b = c;`となって時これはエラーになりますが、エラーにならない方法はありますか？

[code]

      ////////////////int main部///////////////////////////////
      int main(){
    
      C t(9,"TTT");
      C x(4,"AAA");
      C y = x;//コピー
      t = x;//代入
    
      }
     //////////////////source.cpp部////////////////////////////////
            void C::view()const
            {
                for (int i = 0; i < num; i++)
                {
                    cout << " [" << i << "]: "<<vec[i];
                }
                cout << "\n\n";
            }
    
            /*コンストラクタ*/
            C::C(int x = 0, string n = "no name") : num(x), vec(new int[x]), name(n)
            {
                for (int i = 0; i < num; i++)
                {
                    vec[i] = 0;
                }
            }
    
            /*コピーコンストラクタ*/
                C::C(const C& x)
            {
                    cout << "コピーコンストラクタ\n";
                    if (&x != this)
                    {
                        num = 0;
                        vec = NULL;
                    }
                    else {
                        num = x.num;
                        vec = new int[num];
                        for (int i = 0; i < num; i++)
                        {
                            vec[i] = x.vec[i];
                        }
                    }
            }
            /*代入コンストラクタ*/
                C& C::operator = (const C& z)
                {
                    cout << "代入コンストラクタ\n";
    
                    if (&z != this)
                    {
                        if (z.num != num)
                        {
                            delete[] vec;
                            num = z.num;
                            vec = new int[num];
    
                        }
    
                        for (int i = 0; i < num; i++)
                        {
                            vec[i] = z.vec[i];
                        }
    
                    }
    
                    return *this;
                }
             /*ostream&*/
             string C::to_string()const
             {
                 ostringstream os;
                 os << "要素数: " << num << "\n";
                 for(int i = 0; i<num; i++)
                 {
                     os << " [" << i << "]: " << vec[i]<<"\n";
                 }
    
                 return os.str();
             }
    
             ostream& operator <<(ostream& os, C& x)
             {
                 os << x.to_string();
    
                 return os;
             }
    
[/code]


CC BY-SA 4.0
2018-10-30T06:04:27.973
49780
2018-10-30T07:19:38.633
question
c++
代入,コピーコンストラクタの挙動が分からない部分の挙動が知りたい。


> 二つの最初のif文のif(&x == this)やif(&x != this)などはどのような意味なのでしょう

ご存知の通り「this」は「本インスタンス=自分自身」へのポインタを意味します。

つまり「if(&x == this)」を日本語に翻訳するなら  
「もし(自型の参照である引数 x のポインタが、本インスタンス=自分自身のポインタと等しければ)」  
となります。

ちなみに、掲載されたコピーコンストラクタのコードは  
「もし自分自身と異なるなら初期化し、本人ならコピーする」  
といった、常識とは逆のコードになっているのですが、多分誤りだと思います。

また、  
・「代入コンストラクタ」ではなく「代入オペレータ」だと思います。  
・「代入オペレータ」の引数はzです。  
など、やや不整合の多い質問文になってしまっています。  
こういった部分が多いと回答を付けづらくなるので留意が必要です。


CC BY-SA 4.0
2018-10-30T07:09:33.490
49786
2018-10-30T07:17:54.200
2018-10-30T07:17:54.200
3793
3793
49780
answer


良い教科書を探して読んでみるのが手っ取り早いっす。まあここ stackoverflow
でもいいんですけど、質問文を書いて返事がついて、を待っているより教科書読むほうが手早いはず。

回答１. 逆っす。その書き方したら `this==&a` です。これを踏まえて

提示例 `t=x;` は `C& C::operator = (const C& z)` を `this==&t` かつ `z==x`
で呼び出すものです。書くなら `t.operator=(x);` ってわけで。

本文中の質問 Q. 代入演算子の `if (&z != this)` の意味は？  
答：ソースコード中 `x=x;`
とした場合を検出しています。これはわかりやすすぎる例ですが、実用上はポインタや参照を経由して結果的に「同一オブジェクトへの代入」となった場合を想定しています。
`x=x;`
つまり同一オブジェクトへの代入がどうなって欲しいのかは要望次第ですが、まあたいていは「意味的な値が変わらない」ことが要望されると思います。結果的に「何もしない」だけで要望を満たせるので、提示例の代入演算子はそうなっています。

本文中の質問 Q. コピーコンストラクタの `if (&x != this)` の意味は？  
答：同様、自分自身をコピーコンストラクトする場合の検出です。尋常の方法では自分自身を自分自身に上書きコピーコンストラクトすることはできません（どうすればできるのかは宿題としておきましょう）どうなってほしいのかも要望次第で違うでしょう。で、提示コードはバグっているというか多分不等号が逆。

質問２. （コンパイルして試していませんが）できるはず。


CC BY-SA 4.0
2018-10-30T07:19:38.633
49788
2018-10-30T07:19:38.633
8589
49780
answer