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