GeekBand C++オブジェクト向け高度プログラミング(上)(2週目):ピックアップ

1466 ワード

今週は主にばらばらな知識点を記録します.
1.コピーコンストラクタ#
ポインタ付きクラスユーザーが独自のコピーコンストラクタを作成する理由:コンパイラのデフォルトのコピーコンストラクタはbit by bitのモードで行われ、メンバー変数にポインタが含まれている場合、2つのクラスのポインタメンバー変数は同じメモリアドレスを指します.いずれかのクラスがそのメモリを解放すると、別のクラス、すなわち別のクラスポインタが指すアドレスが無効になります.
2.コピー付与関数#
ポインタ付きクラスユーザーが独自のコピー付与関数を作成する理由:理由は同じです.
3.コピー付与関数の自己付与チェック#
Demo_0
MyClass s1;
...
s1 =s1;

Demoのように0のようにs 1=s 1は、何気なくとても愚かなことで、私たちは普通はしませんが、誰が知っていますか.このような状況に備えるために、Demo_1
if(this == & str)
    return *this;

これはいい方法ですが、実は『Effective C++』では他の方法を紹介しています.本は手元になく、後で補充します.
4.参照をいつ使用するか
戻り値がlocal objectでなければreferenceを転送できます
5.static#
  • クラスでは、staticメンバーデータ(変数、定数)を定義したり、staticメンバー関数を定義したりできます.
  • staticメンバーデータはメモリに1つしかありません.クラスのインスタンスに属していません.クラスのインスタンス化よりも先に存在します.
  • staticメンバー関数staticメンバーデータ
  • を処理するために使用される
    6.この1部のみ
  • staticメンバーデータはメモリに1部しかないと述べていますが、実はそれだけでなく、クラスのメンバー関数もメモリに1部しかありません.だから今分かったのは、なぜ計算クラスの大きさが小さいのか、メンバー関数を計算したことがないのではないでしょうか.
  • また、メンバー関数がメモリに1部しかない以上、同じクラスの異なるインスタンスはどのようにメンバー関数を呼び出しますか?次の例を参照してください:Demo_2
  • class myclass
    {
    public:
        void func();  
    };
    ...
    myclass m1;
    myclass m2;
    ...
    //when  calling func(),we use it in the follow form;
    m1.func();
    m2.func();
    //Absolutely,it equals to what I show next;
    func(&m1);
    func(&m2);
    

    すなわち,クラスがメンバー関数を呼び出す場合,クラスのアドレスを参照として関数に渡す.(2つ目の書き方が理解できない場合は、オペレータがリロードしたメンバー数の書き方を参照してください)
    ひとまずここまで