C 什麼時候呼叫拷貝建構函式 賦值運算子

2021-10-21 02:23:44 字數 1958 閱讀 9582

class person

;

拷貝建構函式和賦值運算子的行為比較相似,都是將乙個物件的值複製給另乙個物件;但是其結果卻有些不同,

拷貝建構函式使用傳入物件的值生成乙個新的物件的例項,而賦值運算子是將物件的值複製給乙個已經存在的例項

這種區別從兩者的名字也可以很輕易的分辨出來,拷貝建構函式也是一種建構函式,那麼它的功能就是建立乙個新的物件例項;賦值運算子是執行某種運算,將乙個物件的值複製給乙個已經存在的例項

呼叫的是拷貝建構函式還是賦值運算子,主要是看是否有新的物件例項產生。如果產生了新的物件例項,那呼叫的就是拷貝建構函式;如果沒有,那就是對已有的物件賦值,呼叫的是賦值運算子。

拷貝構造函式呼叫時機主要有以下場景:

範例#include using namespace std;

//定義乙個point類

class point //建構函式

~point(); //析構函式

point(const point &p); //拷貝建構函式 的宣告

int getx()const

int gety()const

private:

int x,y;//私有成員 };

//拷貝建構函式 的定義

point::point(const point &p)

{ x = p.x;

y = p.y;

cout << "calling the copy constructor" <為了更好地理解拷貝建構函式

1、為什麼要有拷貝建構函式,它跟建構函式有什麼區別?

答:拷貝建構函式其實也是建構函式,只不過它的引數是const 的類自身的物件的引用。如果類裡面沒有指標成員(該指標成員指向動態申請的空間),是沒有必要編寫拷貝建構函式的 。     我們知道,如果有乙個類cobj,它已經產生了乙個物件obja,現在又用cobj去建立objb,如果程式中使用語句objb = obja; 也就是說直接使用obja的資料給objb賦值。這對於一般的類,沒有任何問題,但是如果cobj裡面有個char * pstr的成員,用來存放動態申請的字串的位址,在obja中使用new 方法動態申請了記憶體並讓obja.pstr指向該申請的空間,在ojbb = ojba之後,obja.pstr和objb.pstr將同時指向那片空間,這樣到導致了誰也不知道到底該由誰來負責釋放那塊空間,很有可能導致同一塊記憶體被釋放兩次。     使用拷貝建構函式,先申請obja.pstr所指向的空間大小的空間,然後將空間內容拷貝過來,這樣就不會同時指向同一塊記憶體,各自有各自申請的記憶體,各自負責釋放各自申請的記憶體,從而解決了剛才的問題。所以這裡的「拷貝」拷貝的是動態申請的空間的內容,而不是類本身的資料。另外注意到,拷貝建構函式的引數是物件的引用,而不是物件的指標。至於為什麼要用引用,不能夠用指標暫時還沒有搞明白,等搞明白了再說。    

2、為什麼要對=賦值操作符進行過載?

答:接上面的例子,使用者在使用語句objb = obja的時候,或許objb的pstr已經指向了動態申請的空間,如果直接簡單將其指向的位址覆蓋,就會導致記憶體洩露,所以需要對=賦值操作符進行過載,在過載函式中判斷pstr如果已經指向了動態申請的空間,就先將其釋放。    

3、拷貝建構函式和=賦值操作符過載的關係。

答:從原文的例子中可以看出,=賦值操作符過載比拷貝建構函式做得要多,它除了完成拷貝建構函式所完成的拷貝動態申請的記憶體的資料之外,還釋放了原本自己申請的記憶體空間。所以原文最後給出的拷貝建構函式的實現可以使用=賦值操作符的過載來完成。    

4、拷貝建構函式何時被呼叫?

a.物件的直接賦值也會呼叫拷貝建構函式  ;

b.函式引數傳遞只要是按值傳遞也呼叫拷貝建構函式;

c.函式返回只要是按值返回也呼叫拷貝建構函式。

什麼時候呼叫拷貝建構函式

以下幾種情況會呼叫拷貝建構函式 1.以乙個物件初始化另乙個物件 2.函式以某個物件為引數 3.函式返回某個物件 4.初始化序列式容器的元素 2.void test2 另外以下程式 points i pointsarray1.points i 這一行並不會觸發 拷貝建構函式。呼叫的是 賦值運算子。賦值...

什麼時候呼叫複製建構函式(拷貝建構函式)

原文 slyar home www.slyar.com 這個問題不是疑問了,查了一下國外 總結一下。假設person是乙個類,複製建構函式的呼叫會在以下幾種情況下發生 1 物件在建立時使用其他的物件初始化 person p q 此時複製建構函式被用來建立例項p person p q 此時複製建構函式...

C 拷貝建構函式在什麼時候被呼叫?

1 物件在建立時使用其他的物件初始化 person p q 此時複製建構函式被用來建立例項p person p q 此時複製建構函式被用來在定義例項p時初始化p 2 物件作為函式的引數進行值傳遞時 f p 此時p作為函式的引數進行值傳遞,p入棧時會呼叫複製建構函式建立乙個區域性物件,與函式內的區域性...