代入,コピーコンストラクタの挙動が分からない部分の挙動が知りたい。


コピーコンストラクタと代入コンストラクタのコードなのですが  
二つの最初の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]




良い教科書を探して読んでみるのが手っ取り早いっす。まあここ 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)` の意味は？  
答：同様、自分自身をコピーコンストラクトする場合の検出です。尋常の方法では自分自身を自分自身に上書きコピーコンストラクトすることはできません（どうすればできるのかは宿題としておきましょう）どうなってほしいのかも要望次第で違うでしょう。で、提示コードはバグっているというか多分不等号が逆。

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




良い教科書を探して読んでみるのが手っ取り早いっす。まあここ 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)` の意味は？  
答：同様、自分自身をコピーコンストラクトする場合の検出です。尋常の方法では自分自身を自分自身に上書きコピーコンストラクトすることはできません（どうすればできるのかは宿題としておきましょう）どうなってほしいのかも要望次第で違うでしょう。で、提示コードはバグっているというか多分不等号が逆。

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

