inlines

Item 1:View C++ as a federation of languages.
•C++はただの”Cのクラスがあるバージョン”ではない
→例外安全(29項)、テンプレート(41項)、オーバーロード等の導入によりデザインや目指すコードが変化して
いる
•プログラミング言語はあくまで言語
時と共に使い方が変わる。
ベースの4つのプログラム
C
C++のほとんどがCから来ている。Cより良い方法(2項『#defineの”代わり“』や13項)。C++のC部分はC
の効率的なコードを適用する。
Object-Oriented C++
C++のクラス部分。
Template C++
テンプレート(46、48項)
STL
テンプレートライブラリの一種。多くのプログラマが使うときのConvention(規則)があり、使い方が決まってい
る。コンパイルができればいいという考え方は捨てた方がいい。
ex):vector、list、map
おまけBuild-in type(char, int等)はreferenceで関数に渡すより、valueで渡した方が早い。(詳しくは20項)
Item 2:Prefer consts, enums, and inlines to #defines.
• プリプロセッサ・・・コンパイラの前に一定の規則にしたがって処理を加え
る。#includeや#define
• コンパイラ・・・人間の記述したソースコードを、機械語の羅列であるオブ
ジェクトコードに変換する
• #define VALUE 1などで定義した変数などはsymbol tableにのらないた
めコンパイル時にエラーがでてもその値だけが出たりして変数がわから
なくなる。デバッグが大変になる。
• また、浮動小数点の固定値変数を定義する際は、#defineだとオブジェク
トの大きさも2倍になる。Constならコピーしてオブジェクトに埋め込みしな
い(プリプロセッサは変数を全て定義された値に置き換えてオブジェクト生
成)。
→解決法としてconst Value =1;
Item 2:Prefer consts, enums, and inlines to #defines.
const char* const authorName = “Scott Meyers”;
•ポインタのアドレス固定と中身の固定。
•Stringを使うほうがいい
const std::string authorName(“Scott Meyers”);
staticの使い方部分(p.5がちょっと不明)
クラス単位で持つstaticな定数は宣言と定義はコンパイラに依
存する。
#defineはクラスの定数としても使えない、カプセル化にも使え
ない。
Item 2:Prefer consts, enums, and inlines to #defines.
“enum hack” – 定数宣言時の初期化が許されない場合で配列
の初期化を要求された場合等に有効。constの定数はアドレス
を使えるが、enumの定数はアドレスアクセスできない。
つまりdefineに近い。参照とポインタを使わせたくないなら
enumを使う。
#defineを使ってきた理由にマクロがある。Inlineとテンプレート
で代用→constが使える。
プリプロセッサの#includeと#ifdef/#ifndefはまだ使われる価値
がある。
Item 3:Use const whenever possible.
タイトル通りどんなときでも可能な限りconstを使う(超基本、超
大事)。
ポインタのconstは注意。
char *p = greeting; //non-const pointer, non-const data
const char *p = greeting; //non-const pointer, const data
char * const p = greeting; //const pointer, non-const data
const char * const p= greeting; //const pointer, const data
STLのiteratorはポインターで作られており、constなiteratorは
他のポインタを指すことは許されていない、dataは変えることが
できる。値を変えたくなければconst_iteratorを呼ぶ。
Item 3:Use const whenever possible.
p.10わからん
operatorわかりやすい例
http://www.geocities.jp/ky_webid/cpp/language/017.html
constのオブジェクトによって呼び出す関数を変えることができる(p.11)
constのオブジェクトの中でも、そのオブジェクト内だけで使える変数の値を
変えたい場合はmutableを使う。内部内でしか使われない変数を保持してお
り、他はconstオブジェクトで問題ないときに有効。
constなメンバ関数と非constなメンバ関数を用意し、実質同じ動作をする場
合はconstなメンバ関数をconst_castしてconstを外してやればコードは半分
にできる。
非constメンバ関数からconstメンバ関数を呼ぶのは安全。逆は駄目。
Item 4:Make sure that objects are
initialized before they’re used.
オブジェクト内のすべてのデータを、コンストラクタで初期化。
class A {
A::A()
: a(2) //こっちが初期化
{
a = 2;//これは代入。
}
private:
int a;
}
代入はコンストラクタが関数内にはいるときにすでにメモリを確保している分、
重複してaを呼んでいる。initialization list(メンバ初期化子リスト)を使う。
クラスの中のメンバは宣言されている上から順に初期化される。
initialization listは宣言の順番と一緒に書くべき。
Item 4:Make sure that objects are
initialized before they’re used.
staticオブジェクトは使用される前に初期化を保証できないので注意。
staticオブジェクトの参照を返す関数で対応する。
マルチスレッドではこれでも問題が残る。
staticなオブジェクトは正直よくわからないので、デザインを気をつけるという
ことだけ覚えておく(ごめんなさい)。