p346〜p369まで

昨日は送別会だったので1日あいてしまった。

コンストラクタ、デストラクタの呼び出し順

基底クラスから順にコンストラクタが呼ばれる
派生クラスから順にデストラクタが呼ばれる
p346:要点

知ってたけど、これも微妙に認識が甘いと思ってメモ。それがなぜなのかはp348に書いてある。まぁ普通に考えればわかるけれども。

初期化子

クラスのメンバのコンストラクタはクラス宣言に書いた順番に呼ばれる。
p350:要点

これも知ってたけど同じく認識が甘いのでメモ。重要なのは「クラス宣言に書いた順番」ってこと。初期化子の順じゃないよ!

POD型とコンストラク

メンバ変数がPOD型のみで構成された、
独自のコンストラクタの定義されていない構造体やクラスもPOD型。
p353:コラム

これは知らなかったなー。要はコンストラクタを定義してるかどうかってことなのかー。
他にもいろいろ知らないことが。

POD型の場合、デフォルトコンストラクタは0初期化を行い、
コピーコンストラクタは指定された値をそのままコピーする。
変数を宣言した時、何の初期化もしなければデフォルトコンストラクタは呼ばれない。
初期化したい場合には明示的にデフォルトコンストラクタを呼ぶ。
例:
int n; // これはデフォルトコンストラクタは呼ばれない。

class Hoge
{
    Hoge()
    :m_n() // 明示的にデフォルトコンストラクタを呼べば0で初期化。
    {
    }

    int m_n;
};

注意:
int n(); // これはプロトタイプ宣言ですからああああああ!!!

一番最後のはid:uskzのこのエントリ(http://d.hatena.ne.jp/uskz/20080421/p1)のValue-Initializeがどーのこーのってやつだな。

仮想関数テーブル

仮想関数テーブルは基本的に関数のアドレスが書かれた表になっている。
p357:上段
仮想関数テーブルはコンストラクタの最初に初期化され、
デストラクタの最後で破棄される。
p357:中段

これは知らんかった。というか、実際には仮想関数テーブルがどんなものなのか知らなかった。

仮想関数テーブル用の隠しメンバ変数は、
たいていは実際の仮想関数テーブルへのポインタで実装されていると思います。
p:357下段

こいつがvptrか。

クラスの実体の動的確保

お、脱字発見。ArrayStreamクラスがArraySteamクラスになってる。ぬぬぬぬ。これは著者がおいらにTF2をやらせたくするための罠か!!?TF2はSteamからDL購入が可能となっております。明日明後日は無料らしいのでぜひやりましょう。自分のSteamIDはniso1985なんで登録よろしこ^^v

話がずれました。

仮想デストラク

継承時のアクセス指定をprotectedまたはprivateにすると、
そのクラスの外部では基底クラスへのアップキャストは行えなくなる。
p369:コラム

前にも言いましたが、protected継承とprivate継承は使ったことがありません。ってーことでメモ。

今日はここまでー。次はファイルとストリーム。むむむ。これは結構ボリューム有りそうだぞ!Cで結構ファイル周りは触ってたから復習な感じでいければいいかなー。