EffectiveC++改訂2版 第9項〜第13項

第9項

メンバ関数の定義による隠蔽の話。50項では継承関係の中での話しだが、ここでは operator new() の話。

第10項

63ページにあるBLOCK_SIZEの定義はなぜか1項では「古い」とされている形式。
かつ、ここの説明での operator delete() の形式も古い形式の可能性がある。これはEffectiveC++ 改訂2版を読み始める - dogatanaの日記に関連する話。

第11項〜12項

このあたりはさらっと。

第13項

C++のルールによれば、クラスのメンバは、そのクラスで宣言された順番に初期化される。

これは薄っすら覚えているが、実際に確認してみる。

#include <iostream>

//他のクラスのprivteデータメンバで使われるもの
class DataClass {
public:
    DataClass(int n = 0): data(n) {
        std::cout << "const with " << data << std::endl;
    }
    int value() const {
        return data;
    }
private:
    int data;
};

std::ostream& operator<<(std::ostream& output, const DataClass& v)
{
    output << v.value();
    return output;
}


// DataClassを使うクラス
class UseClass {
public:
    UseClass(int v1, int v2, int v3): c(v3), b(v2), a(v1) { }
    void show() {
        std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
    }
private:
    DataClass a, b, c;
};

int main()
{
    UseClass    x(1, 2, 3);
    x.show();
}

実行結果は次のとおり。

const with 1
const with 2
const with 3
a = 1, b = 2, c = 3

初期化リストでは、v3、v2、v1の順に記載しているが、DataClassのコンストラクタの呼び出しは宣言順であるv1、v2、v3の順になっている。なるほど。