独習C++ pp.1-179

独習C++

独習C++

独習C++読んでいます.人生5度目くらいのC++入門.過去4回挫折.「plain Cがあればいいモンね」そう思っていた時期も俺にはありました.

今までことごとく挫折してきたC++入門だけれど,今回はなんか違った.ここ1年くらいCでコードを書くようにしてきたし,低レイヤーのこともブラックボックスにしないで理解しようと努めた結果かもしれない.いずれにせよ,今まで「うー」となっていたことがすんなり理解できた.

独習C++を途中まで一気読み.C++における参照の存在意義がよくわかっていなかったのですが,参照返しを見て少し納得.オブジェクトを値渡しすると,コピーコンストラクタが必要になる話とか,へぇーと思うものが多かった.

サンプルコードが多いので独習C++はものすごく理解しやすい.と今日は思った (昔は思わなかった).

読んだ章

  • 1. C++の概要
  • 2. クラスの概要
  • 3. クラスの詳細
  • 4. 配列,ポインタ,参照
  • 5. 関数オーバーロード

メモ

  • #include
    • clock_t start = clock();
    • clock_t end = clock();
    • (end - start) / CLOCKS_PER_SEC;
  • 無名共用体
  • 構造体メンバはデフォルトですべて公開
  • C++では構造体のタグ名が型名になる
  • inline関数
  • 自動インライン化
    • クラス定義内で関数を定義すると自動インライン化される
    • インライン関数の条件が満たされない場合,通常の関数としてコンパイル
  • オブジェクトの代入
    • デフォルトでは全てのデータメンバがビット単位でコピーされる
      • myclass o1, o2;
      • o1.set(4,6); o2.set(4,9);
      • o2 = o1;
  • 関数呼び出しで使用するオブジェクトのコピーを作成する際には,コンストラクタ関数は呼び出されない
  • 関数が終了してオブジェクトコピーが破棄される際には,デストラクタ関数が呼び出される
    • 引数として使用したオブジェクトが動的にメモリを割り当てていて,デストラクタでメモリを解放する場合,このオブジェクトのコピーがデストラクタの中でそのメモリを解放してしまう
  • gccなどのコンパイラによっては,関数を呼ぶ側と呼ばれる側で二重にオブジェクトを複製することがある
  • フレンド関数
    • クラスメンバではないけれど,クラスの非公開メンバにアクセスできる
    • クラスメンバではないので,クラス名で修飾する必要なし
  • newとdelete
    • newはcstdlibをインクルードする必要ない
    • コンパイラによって失敗した際の挙動が異なる
  • 参照
    • 参照渡しをすれば,上述の値渡しによるデストラクタ呼び出し問題の心配がない (コピーコンストラクタを使う方法もあり)
  • 参照返し
    • 参照返しすることによって代入分の左辺で関数を使用することができる
      • int x;
      • int &f() { return x; }
      • f() = 100;
    • 参照返しはスコープに注意
    • 安全配列
  • 独立参照
    • int x; int &ref = x;
    • x = 10; ref = 10; // 同じ
    • 使うことはないけれど,覚えておく
  • コピーコンストラク
    • オブジェクトのコピーが作成されたときに呼び出される関数
    • classname (const classname &obj) { }
      • array(const array &a);
  • デフォルト引数
    • 1つデフォルト引数を指定したら,残りの仮引数にもデフォルト引数を指定
  • オーバーロード関数のアドレスの探し方
    • ポインタの宣言方法によってアドレスを取得するオーバーロード関数が決まる
      • void space (int count) { ... };
      • void space (int count, char ch) { ... };
      • void (*fp1) (int);
      • void (*fp2) (int, char);
      • fp1 = space; // space(int)関数のアドレスを取得
      • fp2 = space; // space(int, char)関数のアドレスを取得