我的隨行筆記10 C++ Primer Plus

qwer1030274531發表於2020-09-01

1.在解構函式中使用new來分配記憶體時,必須在相應的解構函式中使用delete來釋放記憶體。使用new的類通常需要包含顯示覆制函式和執行深度複製的賦值運算子。(見下2)


2.StringBad sports("Spainshu leavea"); //StringBad 是一個類 呼叫的建構函式形式為:StringBad ( const char *s);


 StringBad sailor=sports; //用一個物件初始化另一個物件,呼叫的建構函式形式為:


 (1)StringBad ( const StringBad & st) {   //複製建構函式


 num_strings++;


len=st.len; str=new char[len+1];  std::strcpy(str,st.str);   }


(2)還需要編寫執行深度複製的類過載賦值運算子:


  StringBad & StringBad::operator=(const StringBAd & st)  {


  if (this==&st) return *this;


 delete [] str; //釋放舊的字串


len=st.len;  str= new char [len+1];  std::strcpy(str,st.str);


return *this;  }


按值傳遞和返回物件,都呼叫複製建構函式。按引用傳遞時,將減少呼叫建構函式的時間。


3.靜態資料,在類宣告中宣告,在類方法的檔案中初始化。靜態成員static,不管建立多少個物件,但只建立一個靜態成員副本。


將成員函式宣告為靜態的,則不能透過物件呼叫靜態成員函式,也不能使用this指標。靜態成員函式宣告放在公有宣告部分,可以使用類名和作用解析運算子來呼叫它


4.如果類中包含了使用new初始化的指標成員,應當自行定義一個複製建構函式,以複製指向的資料,而不是指標,這叫深度複製。淺複製只複製指標資訊,不會深入挖掘以複製指標引用的結構。


5.如果有多個建構函式,則都必須以相同的方式使用new,無引數的建構函式有new時:


String::String()


{   len=0;  str=new char[1];  str[0]='\0';   } 


解構函式: String::~String() { delete   [ ] str; }


6. String *first=&saying[0];  //將指標初始化為指向已有的物件 


  String * second=neew String(sayings[1]); //用new來初始化指標,建立一個新物件 刪除:delete second; //將呼叫動態物件*second的解構函式。


7. char *buffer = new char [512];


   JustTesting *pc1,*pc2; //  JustTesting是一個類


 pc1=new (buffer) JustTesting;// 此句為定位new運算子   


delete pc1; //不合法 需顯示呼叫解構函式才能銷燬物件: pc2->~JustTesting();   


delete  [] buffer; //合法


pc2=new JustTesting ("Heap", 20); //常規new運算子  ...... delete pc2; //合法 ,將自動呼叫解構函式


8.C++11中空指標:NULL、0、nullptr


9. 對於被宣告為引用和const 的類成員,在建立時應當成員初始化列表方式:(這種方法只用於建構函式)


 (1)class Queue { private : .....  int items; .const int qsize;   };   


   Queue::Queue(int qs) : qsize (qs) {  item=0; front =rear=NULL;  }  //


或者  Queue::Queue(int qs) : qsize (qs) , item(0) ,front (NULL), rear(NULL){ }


(2) class Agency{...}


   class Agent { private:  Agency &belong;.....};


   Agent::Agent(Agency &a): belong(a)  {.......}   


10. C++11允許在類定義中初始化。


class Queue


{ private: .....int item=0; ...  const int qsize=Q_SIZE;


};


但使用成員初始化列表的建構函式將覆蓋相應的類內初始化。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2716306/,如需轉載,請註明出處,否則將追究法律責任。

相關文章