more effecitve C++読書ノート1
1882 ワード
条項1 pointersとreferenceを細かく区別する
結論:あるものを指す必要があり、ポインタによって達成されず、参照を選択し、他の選択ポインタを選択する必要があります.
条項2 C++変換オペレータを使用することが望ましい
条項3配列をマルチステートで処理しない
条項4デフォルト構造(default constructor)を提供する必要はありません.
デフォルトのコンストラクション関数を提供しません!
条項5カスタマイズされたタイプ変換関数に警戒する
//reference ,
string & s;//
string S("xy");
string& rs = s;
// null reference reference pointers
1.reference pointer
// , , 。 。
string s1("xx");
string s2("yy");
string& rs = s1;
string *ps = &s1;
rs = s2; //rs S1 S1 yy
ps = &s2; //ps S2 S1
結論:あるものを指す必要があり、ポインタによって達成されず、参照を選択し、他の選択ポインタを選択する必要があります.
条項2 C++変換オペレータを使用することが望ましい
//
//static_cast const_cast dynamic_cast reinterpret_cast
: (type) xxxxx
: static_cast (xx)
eg.
int a,b;
double result = ((double)a/b);
int a , b;
double result = static_cast(a)/b;
//static_cast C 。
//const_cast const
void update(aaa *s);
const aaaa& csw = sw;
update(&csw); // update
update(const_cast&csw); // 。
// dynamic_cast
//reinterpret_cast
typedef void (*F)();
F fun[10];
// fun
int do();
fun[0] = & do; //
fun[0] = reinterpret_cast (& do );
条項3配列をマルチステートで処理しない
class B{...};
class Bt:public B{...};
// ints
void printints(ostream& s, const B arry[],int num)
{
for(int i = 0; i< num ; ++i)
{
S<< arry[i];
}
}
//
B barry[10];
printints(count,barry,10); //
Bt barry[10];
printints(cout , barry , 10); //
//arry[i] *(arry+i) arry
// +i i*sizeof( ) arry B
// Bt B
条項4デフォルト構造(default constructor)を提供する必要はありません.
デフォルトのコンストラクション関数を提供しません!
条項5カスタマイズされたタイプ変換関数に警戒する