C++_コピーコンストラクタとは

operator= の意味が不明なので、コピーコンストラクタを調べればわかるかと思ったが結局分からず。
コピーコンストラクタもよく分からん。なんで↓問題が回避できるのか不明。

 

コピーコンストラク

    C ( const C & );
    C &operator=( const C & );

オブジェクトのコピーがとられた時に実行する処理。
そのクラス型への参照を引数にとるコンストラク

 

コピー用の初期化を作成することにより、以下の時の問題を回避できる

    obj2 = obj1
メンバ変数がポインタであるメモリアドレスを指していた場合、
二つの異なるオブジェクトがまったく同じメモリアドレスを競合することになる。
これにより、
メモリアドレスが解放されなくなったり
デストラクタで 2 度同じ領域を開放するなどの不具合が発生する。

 

呼び出されるタイミング

コピーコンストラクは、オブジェクトの初期化時 ( コピー 時 ) に呼び出されるもの。

宣言時 ( オブジェクトの初期化時 )
引数 ( オブジェクトを関数に値渡しする時 )
戻り値 ( 関数からオブジェクトを値渡しする時 )

 

ex ) 略ソース

    public:
    C ( ) { str = "Hello"; }
    C ( const C &obj ) { str = "Hey"; }

 

宣言時

    int main( )
    {
        C c2 = c1
        // この時、コピーコンストラクが呼び出される
       
        std::cout << c1.str // Hello
        std::cout << c2.str // Hey
       
       
        // 下記場合コピーコンストラクは呼び出されない。
        //   初期化ではなく代入なので
        //C c3;
        //c3 = c1
    }

 

引数

    int main( )
    {
        C c1
        auto get = getC ( c1 )
        return 0;
    }

 

戻り値

    C getC ( C obj )
    {
        return obj;
    }

 

 

コンストラクタが自動で作ってしまう関数を禁止する

コピーコンストラクタ・代入演算子は書かなくても自動で作成される。

自動作成を禁止する基本的な方法はコピーコンストラクタ、代入演算子
private 領域に書くこと。

 

C++ 11 では delete を使うと禁止される。
    C ( const C & ) = delete;
    C &operator=( const C & ) = delete;

 

 

こちらから。
http://yohshiy.blog.fc2.com/blog-entry-303.html
http://wisdom.sakura.ne.jp/programming/cpp/cpp17.html
http://wisdom.sakura.ne.jp/programming/cpp/cpp8.html
http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02009.html

 

以上。operator= が結局わからない。