新增前面介紹過的複製建構函式和賦值運算子,使類能夠正確管理類物件使用的記憶體。
知道物件何時被建立和釋放。
***********************************
string::string()
delete[ ]與使用new[ ]初始化的指標和空指標都相容。
以其他方式初始化的指標,使用delete時,結果將是不確定的。
c++11空指標:
nullptr 關鍵字表示空指標;
還可以使用就標準c++98中的方式:0
***********************************=
friend bool operator == (const string &st1, const string &st2);
將比較函式作為友元,有助於將string類物件與常規的c字串進行比較。
if (「love」 == answer)
將被轉換為
if (operator==(「love」,answer));
然後編譯器將使用某個建構函式將**轉換為:
if (operator==(string(「love」), answer));
***********************************=
string opera(「the magic flute」);
對於表示式opera[4],c++將查詢名稱與特徵標與此相同的方法;
string::operator(int i)
如果找到匹配的原型,編譯器將使用下面的函式呼叫來替代表示式opera[4]:
opera.operator[ ](4)
opera物件呼叫該方法,陣列下標4成為該函式的引數。
有了上述定義:
cout <
被轉換為:
cout <
返回值將是opera.str[4]。由此公有方法可以訪問私有資料。
將返回型別宣告為char &,便可以給特定元素賦值。
string means(「might」);
means[0] = 『r』;
第二條語句被轉換為乙個過載運算子函式呼叫:
means.operator(0)=』r』;
這裡將r賦給方法的返回值,上述**等同於:
means.str[0] = 『r』;
但在過載時,c++將區分常量和非常量函式的特徵標,因此可以提供另乙個僅供const string物件使用的operator()版本。
***********************************====
可以將成員函式宣告為靜態的,函式宣告必須包含關鍵字static。
但如果函式定義是獨立的,則其中不能包含關鍵字static,這樣做有兩個重要的後果。
首先,不能通過物件呼叫靜態成員函式 ,實際上,靜態成員函式甚至不能使用this指標。
如果靜態成員函式時再公有部分宣告的,則可以使用類名和作用域運算子來呼叫它。
例如:可以給string類新增乙個名為howmany()的靜態成員函式,方法是在類宣告中新增如下原型定義:
static int howmany()
由於靜態成員函式不與特定的物件相關聯,只能使用靜態資料成員。
可以使用靜態成員函式設定類級標記,以控制某些類介面的行為,例如:類級標記可以控制顯示類內容的方法所使用的格式。
***********************************===
C 類和動態記憶體分配
預設析構函式 複製建構函式 賦值運算子 位址運算子 ifndef zhumeng h define zhumeng h include class zhumeng endif include zhumeng.h int zhumeng numm 0 zhumeng zhumeng zhumeng z...
C 類和動態記憶體分配
如果有這樣的strbad類 include ifdef strbad h define srebad h class strbad endif include include stringbad.h using std cout int strbad num 0 靜態成員變數不能在宣告中初始化 除非...
類和動態記憶體分配
part 1 靜態類成員特點 無論建立了多少物件,程式都只建立乙個靜態類變數副本。也就是說,類的所有物件共享乙個靜態成員。靜態資料成員在類宣告中宣告,在包含類方法的檔案中初始化。初始化時使用作用域運算子來指出靜態成員所屬的類。但如果靜態成員是const整數型別或列舉型,則可以在類宣告中初始化。par...