C 拷貝建構函式和過載賦值運算子的區別

2021-09-26 03:16:11 字數 1864 閱讀 1863

賦值運算子和拷貝建構函式最大區別是賦值運算子沒有新的物件生成,而拷貝建構函式會生成新的物件。

為了更加形象 準確得描述 賦值運算子和拷貝建構函式得區別,將詳細通過**展示兩者之間得差異。

首先從建構函式說起,在c++物件導向的設計中,每乙個物件代表乙個抽象集合的實體,此時每乙個實體在當前執行的程序中是需要對應的記憶體空間,即物件存在則有空間。為此,c++引入建構函式來例項化物件,並讓編譯器為該物件向作業系統申請對應的空間,從而能夠存在於作業系統之中。

拷貝建構函式則是為了將老物件的資料成員一一賦值給新的物件資料成員的一種建構函式,即拷貝建構函式的結果和建構函式一致,都是有新的物件生成。

檢視如下**:

#include

using namespace std;

class aa(

int a)a(

const a &a)~a

()void

print()

private:

int num;};

void

para_copy

(a &a)

intmain()

輸出如下:

constructor with param //a 過載構造

copy constructor //a1 拷貝構造

100default constructor //c預設構造

destructor 0

//c析構

destructor 100

//a1析構

destructor 100

//a析構

拷貝構造函式呼叫場景如下:

關於深拷貝和淺拷貝的描述如下:

通常,預設生成的拷貝建構函式和賦值運算子,只是簡單的進行值的複製。如果類的資料成員有指標,僅僅通過值傳遞進行拷貝構造的話會造成兩個物件的成員指標指向同一塊記憶體,當兩個物件析構的時候會對同乙個記憶體釋放兩次,從而會造成指標空懸。

深拷貝即以上第二種情況,資料成員中有指標變數的時候拷貝建構函式使用深拷貝,即建構函式中重新指定初始化物件的位址空間。

**如下:

#include

using namespace std;

class a

//a(int a) a(

const a &a)~a

()void

print()

}private:

int num;

int*p;};

void

param_copy

(a a)

intmain()

賦值運算子和拷貝建構函式最大區別即是賦值運算子沒有新的物件生成,而拷貝建構函式會生成新的物件。

#include

using namespace std;

class person

person

(const person& p)

person& operator=

(const person& p)

private:

int age;

string name;};

void

f(person p)

person f1()

intmain()

輸出如下:

copy constructor

assign

copy constructor

copy constructor

assign

copy constructor

拷貝建構函式與賦值運算子過載

拷貝建構函式 只有單個形參,該形參是對本類型別物件的引用 一般常用const修飾 在用已存在的類型別物件建立新物件時由編譯器自動呼叫。1.拷貝建構函式是建構函式的乙個過載形式 class date date const date d private int year int month int da...

拷貝建構函式與過載賦值運算子

注意 該作者部落格已遷移至 如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外的引數都有預設值,則此建構函式是拷貝建構函式。c premier裡的定義 拷貝建構函式應用的場景 預設拷貝建構函式 class ctest ctest void test ctest obj intmain 這個程...

C 拷貝建構函式和賦值運算子

本文主要介紹了拷貝建構函式和賦值運算子的區別,以及在什麼時候呼叫拷貝建構函式 什麼情況下呼叫賦值運算子。最後,簡單的分析了下深拷貝和淺拷貝的問題。在預設情況下 使用者沒有定義,但是也沒有顯式的刪除 編譯器會自動的隱式生成乙個拷貝建構函式和賦值運算子。但使用者可以使用delete來指定不生成拷貝建構函...