more effecitve C++読書ノート1

1882 ワード

条項1 pointersとreferenceを細かく区別する
//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カスタマイズされたタイプ変換関数に警戒する