賦值構造函數和賦值運算符


一、復制構造函數

1、簡介

復制構造函數用於將一個對象復制到新創建的對象中。它用於初始化過程中(包括調用函數時按值傳遞參數),而不是常規的賦值過程中。其原型通常如下:

Class_name(const Class_name &);

它接受一個指向類對象的常量引用作為參數。例如,String類的賦值構造函數的原型如下:

String(const String &);

2、何時調用

新建一個對象並初始化為同類現有對象時,復制構造函數將被調用。

假設st是一個已有的Stirng對象(假設的,不是平常用的那個string),則下面四種聲明都將調用復制構造函數:

①String st1(st);

②String st1=st;

③String st1=String(st)

④String *pst=new String(st);

上述②、③這兩種聲明可能會使用復制構造函數直接創建st1,也可能使用復制構造函數生成一個臨時對象,然后將臨時對象的內容賦給st1,取決於具體實現。

像④,它會使用st初始化一個匿名對象,並將新對象的地址賦給pst指針。

3、默認復制構造函數的功能

默認的復制構造函數逐個復制非靜態成員(淺拷貝),復制的是成員的值。

假設String類型有成員str(const char *),len(int),那么下述語句:

String st1=st;

與下面的代碼等效:

String st1;

st1.str=st.str;

st1.len=st.len;

二、賦值運算符

1、簡介

C++允許類對象賦值,這是通過自動為類重載賦值運算符實現的,這種運算符的原型如下:

Class_name & Class_name::operator=(const Class_name &);

它接受並返回一個指向類對象的引用。例如,String類的賦值運算符的原型如下:

String & String::operator=(const String &);

2、何時調用

將已有的對象賦給另一個對象時,將使用重載的賦值運算符:

String st("123456");

String st1;

st1=st; //此處使用了賦值運算符

初始化對象時,並不一定會使用賦值運算符,如下:

String st1=st;

st1是新建對象,被初始化為st的值,使用了復制構造函數。在前面講復制構造函數時說過,具體實現時可能會分兩步:使用復制構造函數創建一個臨時對象,然后通過賦值將臨時對象的值賦值到新對象中。但是,也有可能可能會使用復制構造函數直接創建新對象。

3、默認賦值運算符的功能

與復制構造函數相似,賦值運算符的隱式實現也對成員進行逐個賦值(淺拷貝),如果成員本身就是類對象,則程序員將使用為這個類定義的賦值運算符來復制該成員,但靜態數據成員不受影響。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM