初始化 賦值 拷貝

2021-07-02 01:44:10 字數 1622 閱讀 9484

折騰我挺長一段時間,基本挺明白了,先來個區別說明:賦值操作是在兩個已經存在的物件間進行的,而初始化是要建立乙個新的物件,並且其初值**於另乙個已存在的物件。編譯器會區別這兩種情況,賦值的時候呼叫過載的賦值運算子,初始化的時候呼叫拷貝建構函式。如果類中沒有拷貝建構函式,則編譯器會提供乙個預設的。這個預設的拷貝建構函式只是簡單地複製類中的每個成員。 下面看例子。

c++中初始化和賦值操作差別是很大的。

對於基本資料型別差別不大:

比如:

int a = 12;// initialization, copy 0x000c to a

a = 12;// assignment, copy 0x000c to a

但是對使用者自定義的資料型別比如string 初始化和賦值就差別很大:

class string ;
初始化的構造過程比較簡單:先分配乙個足夠大的空間然後填充上資料:

string::string( const

char *init )

析構過程更簡單:

string::~string()
但是如果賦值操作就複雜多了:

string &string::operator =( const char *str )
建議在條件允許的情況下最好在初始化的時候就賦值,而盡量避免用=號賦值了,比如用成員初始化列表來初始化成員資料,不在建構函式裡用賦值操作給成員資料.

複製建構函式與賦值操作符之間的區別

複製建構函式又稱拷貝建構函式,它與賦值操作符間的區別體現在以下幾個方面

1.從概念上區分:

複製建構函式是建構函式,而賦值操作符屬於操作符過載範疇,它通常是類的成員函式

2.從原型上來區分:

複製建構函式原型 classtype(const classtype &); 無返回值

賦值操作符原型 classtype& operator=(const classtype &); 返回值為 classtype 的引用,便於連續賦值操作

3.從使用的場合來區分:

複製建構函式用於產生物件,它用於以下幾個地方:函式引數為類的值型別時、函式返回值為類型別時以及初始化語句,例如(示例了初始化語句,函式引數與函式返回值為類的值型別時較簡單,這裡沒給出示例)

classtype a;        //

classtype b(a); //呼叫複製建構函式

classtype c = a; //呼叫複製建構函式

而賦值操作符要求『=』的左右物件均已存在,它的作用就是把『=』右邊的物件的值賦給左邊的物件

classtype e;

class

type f;

f = e; //呼叫賦值操作符

4.當類中含有指標成員時,兩者的意義有很大區別

複製建構函式需為指標變數分配記憶體空間,並將實參的值拷貝到其中;而賦值操作符它實現的功能僅僅是將『=』號右邊的值拷貝至左值,在左邊物件記憶體不足時,先釋放然後再申請。當然賦值操作符必須檢測是否是自身賦值,若是則直接返回當前物件的引用而不進行賦值操作

直接初始化和拷貝初始化

定義 示例 string dots 10,直接初始化 string s dots 直接初始化 string s2 dots 拷貝初始化 string null book 9 999 99999 9 拷貝初始化 string nines string 100,9 拷貝初始化注 直接初始化實際上是要求編...

賦值和初始化不同以及安全拷貝

string 類的原型如下 class string string string string string const char str else 當初始化串存在的時候,為m data申請同樣大小的空間存放該串 string string const string other 拷貝建構函式,功能與...

C 拷貝 複製 賦值 初始化的理解

說明一下幾個詞的關係 拷貝 複製 賦值 初始化 因為以前一直沒深究它們的區別,直到拜讀了c primer 5和c primer plus 6之後,發現前者使用的是 拷貝建構函式 後者則是 複製建構函式 再聯想到c 中經常出現的拷貝 賦值 複製這三個詞語,所以這裡進行乙個個人總結。拷貝和複製這兩個詞語...