12 1 複製建構函式和賦值運算子

2021-09-11 17:02:27 字數 2038 閱讀 3256

特點

靜態資料成員,永遠只建立乙個儲存空間,所有物件共享,可以用來判斷建立了多少個物件的功能。

在類的宣告時不分配記憶體

靜態類成員不是物件的組成部分

例項

class badstring ;
若要實現計數建立物件個數,則建構函式可以為:

badstring::badstring(char *n, int a)
初始化

首先,其初始化不能在函式體內,在包含類方法的檔案中初始化

不能在類的宣告處初始化

必須先初始化再建立物件

如果靜態成員是整型或者列舉型const,可以在類宣告中初始化

int badstring::number = 0;//初始化指出了型別,作用域,但不用static

int main()

**形式:**成員函式宣告為靜態的,函式宣告必須包含關鍵字static,定義中不能包含static。

特點:與一般的成員函式不同,不能通過物件呼叫靜態成員函式,靜態成員函式不能使用this指標,因此只能使用靜態成員。若靜態成員函式是在公有部分宣告,則可以使用類名和作用於解析運算子呼叫。

class aclass;//宣告方法

};int a=aclass::a();//呼叫方法

badstring();

badstring(int a = 0);

若同時採用這兩種建構函式會產生二義性錯誤。

預設複製建構函式在存在動態記憶體和靜態類成員時會出錯,因為其是淺複製,兩個物件同時指向同一片動態記憶體空間,靜態數值不變。

形式:

badstring(badstring &a);
作用:

複製建構函式用於將乙個物件複製到新建立的物件中,也就是用於初始化過程中(包括按值傳遞),而不是常規的賦值過程。

當使用傳值呼叫時,呼叫函式會使用複製建構函式建立新物件,這個物件時函式的區域性變數,若沒有深度複製建構函式,則會發生錯誤。

2.2.1、何時呼叫複製建構函式?

新建乙個物件並將其初始化為同類物件時。

badstring std("liming", 13);

badstring s1(std);

badstring s2 = s1;

badstring s3 = badstring(s1);

badstring *s4 = new badstring(s1);

按值傳遞時:

badstring fun(badstring a);

fun(s1);

此時,當傳遞到函式時呼叫複製建構函式,建立臨時物件,然後返回時再建立乙個臨時物件返回。

預設賦值運算子在存在動態記憶體和靜態類成員時會出錯,因為其是淺複製,兩個物件同時指向同一片動態記憶體空間,靜態數值不變。

形式:

class_name & class_name::operator=(const class_name &);
何時使用:

將已有的物件賦給另乙個物件時

badstring s2;

s2 = s1;

在c語言中使用null表示空指標,但是在c++11中提供更好的方案,引入關鍵字nullptr表示空指標。

str=nullptr;

複製建構函式和賦值運算子

進行c 類設計時,如果不對複製建構函式和賦值運算子進行重寫的話,編譯器會預設呼叫預設函式。預設的複製建構函式和賦值運算子會造成許多問題。先看下面一段 include include class my string int my string num string 0 my string my str...

C 複製建構函式和賦值運算子過載函式

宣告乙個空的類testsize,sizeof testsize 為1,為其宣告建構函式和析構函式,依舊為1 建構函式不能使用關鍵字virtual,析構函式可以 一旦類中存在虛函式,就會為該類生成虛函式表,並在每乙個例項中新增乙個指向虛函式表的指標,從而大小為乙個指標大小,32位機器上為4,64位機器...

C 複製建構函式,過載賦值運算子

c 的複製建構函式,賦值建構函式,有時候會有點暈,下面總結一下 首先來談一下複製建構函式 includeusing namespace std include includeclass a void fuction void show int main 解釋 定義了乙個類,資料成員有字元指標,和整型...