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