1、先看這個例子:
#include #include using namespace std;
class student;//建構函式
student(string strname, int nage) :name(strname), age(nage){}//帶引數的建構函式
~student(){};
void show() };
int main()
執行結果是:
2、分析
其中下面兩個語句分別是物件的「複製」和「賦值=」:
student st2(st1);//複製建構函式(拷貝建構函式)
student st3 = st1; // 賦值
在給物件賦值時候其實也是呼叫的複製建構函式,那麼這個複製建構函式在**?類中並沒有定義,其實在物件st2建立的時候,系統自動生成了乙個複製建構函式,就像類中沒有定義預設建構函式,在物件建立的時候會自動建立乙個預設建構函式一樣。
複製建構函式的作用就是把目標物件的所有成員賦值給自己的所有成員,這裡的成員都是簡單成員。複製建構函式的形式如下:
classname (const classname& obj)
引數是該類的乙個物件的引用,是個常量,為了防止在複製時更改目標物件;返回值是乙個該類的物件。
上面的例子在執行student st2(st1);的時候其實就是 讓st2.name = st1.name;st2.age = st1.age;
上面所說的簡單成員,其實就是不能包括動態分配的資料。如果student類中還有乙個類似下面的私有成員:
course *pcourse;
其中,關聯如下的結構體:
struct course
;
那麼pcourse需要先在物件構造的時候動態分配記憶體。
改動程式如下所示:
struct course
;class student;
student(string strname, int nage,int courseid,double dscore)//帶引數的建構函式
~student()
void show() };
int main()
此時執行報錯。因為student類中包含了需要動態分配記憶體的pcourse 成員。
其實自定義乙個複製建構函式就可以實現這種複雜物件的複製。新增如下複製建構函式:
student(const student &st)//複製建構函式
可以正常執行,執行結果:
3、物件複製和物件賦值的區別
(1)物件複製:用已有物件初始化新的物件。
(2)物件賦值:就是已經定義了兩個物件,把乙個物件的成員 賦值給另乙個物件的成員。
4、如果說物件賦值是先定義好乙個物件,比如說st3,那麼st3的成員pcourse 已經被new過一次,如果再通過st3 = st1的時候相當於呼叫了複製建構函式(student (const student & st));其中又對 pcourse 進行了一次new 。
雖然執行正常,但是感覺還是不對。
譚浩強《c++程式設計 》p293 頁中指出:「類的資料成員中不能包括動態分配的資料,否則在賦值的時候可能出現嚴重的後果。」
物件複製和物件賦值的區別
1.何時呼叫複製建構函式 複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下 class name const class name 它接受乙個指向類物件的常量引用作為引數。例如,string類的複製建構函式的原型如下 ...
物件的賦值和複製
物件之間可以通過賦值運算子 進行賦值運算,通過以下的程式可以看出。include using namespace std class box box box int h,int w int len int box volume int main 說明 物件的賦值只對其中的資料成員進行賦值,而不對成員...
C 物件的賦值和複製
3.6.1 物件賦值語句 如同基本型別賦值語句一樣,同型別的物件之間也可以進行賦值,即乙個物件的值可以賦給 另乙個物件。這裡所指的物件的賦值是指對其中的資料成員賦值,而不對成員函式賦值。例如 a和b是同一類的兩個物件,那麼下述物件賦值語句 b a 就能把物件a的資料成員的值逐位複製給物件b 例3.2...