靜態數據成員在類聲明中聲明,在包含類方法的文件中初始化。初始化時使用做用域運算符來指出靜態成員所屬的類。但若是靜態成員是整型或枚舉型const,則能夠在類聲明中初始化。程序員
strlen返回字符串長度,但不含末尾的空字符函數
字符串並不保存在對象中,而是單獨保存在堆內存中,對象僅保存了到哪去查找字符串的信息。spa
刪除對象能夠釋放對象自己佔用的內存,但不能自動刪釋放屬於對象成員的指針所指向的內存,因此必須使用析構函數並用delete釋放這種內存。指針
按值傳遞、生成臨時對象時,都將調用複製構造函數。code
若是類中包含了使用new初始化的指針成員,則應當定義一個複製構造函數,以複製指向的數據,而不是指針,這類稱爲深度複製,複製的另外一種形式是調用隱式複製構造函數,進行淺複製,淺複製僅僅複製指針信息,而不會深刻挖掘以複製指針引用的結構。對象
與複製構造函數類似,賦值運算符的隱式實現也對成員進行逐個複製。內存
複製構造函數和賦值構造函數的從新定義上的區別:ci
因爲目標對象可能引用了之前分配的數據,因此函數應用delete[ ] 來釋放這些數據作用域
函數應當避免將對象賦給自身;不然給對象從新賦值前,釋放內存操做可能刪除對象的內容字符串
函數返回一個指向調用對象的引用
delete[ ] 與使用new[ ]初始化指針和空指針都兼容,對於以其餘方式初始化的指針,使用delete[ ]時,結果將是不肯定的,如new char[1]與 new char分配的內存量相同,區別在於前者與delete[ ]兼容,然後者不兼容
C++98中,字面值0既能夠表示數字0,也能夠表示空指針,也有程序員使用NULL;在C++11中,引入新關鍵字nullptr,建議使用它來表示空指針
較早的get(char*,int)版本在讀取空行時,第一個字符將是空字符;而較新的版本里返回值爲false,採用
if (!cin || temp[0] == '\0' ) break;
則if語句中的第一個條件將檢測到空行,第二個條件用於舊版本檢測到空
若是有多個構造函數,必須以相同的方式使用new,要麼帶中括號,要麼都不帶。由於只有一個析構函數,全部的構造函數的都必須與他兼容。
應定義一個複製構造函數,經過深度複製將一個對象初始化爲另外一個對象,即應分配足夠的空間來存儲複製的數據,並複製數據,而不單單是數據的地址,並更新受影響的靜態類成員。
應定義一個賦值運算符,經過深度複製將一個對象複製給另外一個對象,該方法應該完成這些操做:檢查自我賦值的狀況,釋放指針之前指向的內存,複製數據而不單單是數據的地址,並返回一個指向調用對象的引用。
若是方法或函數要返回局部對象,則應返回對象,而不是指向對象的引用。在這種狀況下,將使用複製構造函數來生成返回的對象。若是方法或函數要返回一個沒有公有複製構造函數的類的對象,則必須返回一個指向這種對象的引用。最後有些方法和函數能夠返回對象,也能夠返回指向對象的引用,在這種狀況下,應首選引用,由於其效率更高。
若是對象是動態變量,則當執行完該對象的程序塊時,將調用該對象的析構函數
若是對象是靜態變量,則在程序結束時將調用對象的析構函數
若是對象是new建立的,則僅當顯示使用delete刪除對象時,其析構函數纔會被調用
定位new運算符可以在分配內存時指定內存位置,但沒法使用delete運算符。要對定位new運算符使用的內存單元進行管理,必須加入合適的delete和顯式的析構函數調用:對於定位new運算符建立的對象,應以與建立順序相反的順序予以刪除(晚建立的對象可能依賴於早建立的對象),另外僅當全部對象都被銷燬後,才能釋放用於存儲這些對象的緩衝區。
若是數據成員是非const成員或引用,則必須採用這種格式,但可將C++11新增的類內初始化用於非靜態const成員。
C++容許類內初始化,這與使用成員初始化列表等價,然而使用成員初始化列表的構造函數將覆蓋相應的類內初始化。