c 物件的複製與賦值

2021-07-09 10:55:38 字數 3119 閱讀 3993

1

、物件的賦值

如果對乙個類定義了兩個或多個物件,則這些同類的物件之間可以互相賦值,或者說,乙個物件的值可以賦給另乙個同類的物件。這裡所指的物件的值是指物件中所有資料成員的值。

物件之間的賦值也是通過賦值運算子"=

"進行的。本來,賦值運算子"=

"只能用來對單個的變數賦值,現在被擴充套件為兩個同類物件之間的賦值,這是通過對賦值運算子的過載實現的

(關於運算子的過載將在第

4章中介紹

)。實際上這個過程是通過成員複製

(memberwise copy)

來完成的,即將乙個物件的成員值一一複製給另一物件的對應成員。

物件賦值的一般形式為:

物件名1=

物件名2

;注意:

物件名l

和物件名

2必須屬於同乙個類。

例如student studl

,stud2;//

定義兩個同類的物件

stud2=studl;//

將studl

各資料成員的值賦給

stud2

通過下面的例子可以了解怎樣進行物件的賦值。 例

9 物件的賦值。

#include

using namespace std;

class box

;box::box(int h,int w,int len)

int box::volume()

//返回體積的值

int main()

執行結果如下:

the volume of boxl is 11250

the volume of box2 is 11250

說明:(1)

物件的賦值只對其中的資料成員賦值,不對成員函式賦值。資料成員是佔儲存空間的,不同物件的資料成員占有不同的儲存空間,賦值的過程是將乙個物件的資料成員在儲存空間的狀態複製給另一物件的資料成員的儲存空間。而不同物件的成員函式是同乙個函式**段,不需要、也無法對它們賦值。

(2)類的資料成員中不能包括動態分配的資料,否則在賦值時可能出現嚴重後果

(在此不作詳細分析,只需記住這一結論即可)。

2、物件的複製

有時需要用到多個完全相同的物件

:其一般形式為:類名

物件2(

物件1);/

/用物件

l複製出物件2。

有這就是物件的複製機制。用乙個已有的物件快速地複製出多個完全相同的物件。 如:

box box2(boxl)

;// 

其作用是用已有的物件

boxl

去轉殖出乙個新物件

box2。

可以看到:

它與前面介紹過的定義物件方式類似,但是括號中給出的引數不是一般的變數,而是物件。在建立乙個新物件時呼叫乙個特殊的建構函式

——複製建構函式

(copy constructor)

。這個函式的形式是這樣的:

//the copy constructor definition

box::box(const box&b)

說明:1

、複製建構函式也是建構函式,但它只有乙個引數,這個引數是本類的物件

(不能是其他類的物件

),而且採用物件的引用的形式

(一般約定加

const

宣告,使引數值不能改變,以免在呼叫此函式時因不慎而使物件值被修改

)。此複製建構函式的作用就是將實參物件的各資料成員值一一賦給新的物件中對應的資料成員。2、

複製物件的語句

box box2(boxl)

;這實際上也是建立物件的語句,建立乙個新物件

box2

。由於在括號內給定的實參是物件,因此編譯系統就呼叫複製建構函式

(它的形參也是物件

),而不會去呼叫其他建構函式。實參

boxl

的位址傳遞給形參

b(b是

boxl

的引用)

,因此執行複製建構函式的函式體時,將

boxl

物件中各資料成員的值賦給

borg

中各資料成員。3、

使用者可以在宣告類時定義複製建構函式,如果使用者自己未定義複製建構函式,則編譯系統會自動提供乙個預設的複製建構函式,其作用只是簡單地複製類中每個資料成員。

4、還提供另一種方便使用者的複製形式,用賦值號代替括號.

其一般形式為:

類名物件名

1=物件名2;

如:box box2=box1;//

用boxl

初始化box2

可以在乙個語句中進行多個物件的複製,但是其作用都是呼叫複製建構函式。5、

物件的複製和

1節介紹的物件的賦值在概念上和語法上的不同。

請注意普通建構函式和複製建構函式的區別。

(1)在形式上類名(

形參表列);

//普通建構函式的宣告,如

box(int

,int w

,int leu);類名

(類名&物件名);

//複製建構函式的宣告,如

box(box &b)

;(2)

在建立物件時,實參型別不同。系統會根據實參的型別決定呼叫普通建構函式或複製建構函式。如

boxboxl(12,15,l6);//

實參為整數

(普通資料型別

),呼叫普通建構函式

boxbox2(boxl);//

實參是物件名

(類資料型別

),呼叫複製建構函式

(3)在什麼情況下被呼叫

普通建構函式在程式中建立物件時被呼叫。

複製建構函式在用已有物件複製乙個新物件時被呼叫,在以下

3種情況下需要轉殖物件:

①程式中需要新建立乙個物件,並用另乙個

同類的物件對它初始化。②

函式的引數為類的物件時

,在呼叫函式時需要將實參物件完整地傳遞給形參,也就是需要建立乙個實參的拷貝,這就是按實參複製乙個形參,系統是通過呼叫複製建構函式來實現的,這樣能保證形參具有和實參完全相同的值。

③函式的返回值是類的物件。

在函式呼叫完畢需要將返回值(物件

)帶回函式呼叫處時。此時需要將函式中的物件複製乙個臨時物件並傳給該函式的呼叫處。

物件的賦值與物件的複製

物件的賦值針對指物件中所有資料成員的值 物件的賦值只對其中的資料成員賦值 物件賦值中,不涉及成員函式的話題,因為同一類的所有物件有各自 的成員資料,但是成員函式是共享的。同類物件之間可以互相賦值,物件名1 物件名2.實現的原理 賦值運算子的過載。物件的複製是用已有的物件轉殖出乙個新物件 類名 物件2...

C 物件的賦值和複製

3.6.1 物件賦值語句 如同基本型別賦值語句一樣,同型別的物件之間也可以進行賦值,即乙個物件的值可以賦給 另乙個物件。這裡所指的物件的賦值是指對其中的資料成員賦值,而不對成員函式賦值。例如 a和b是同一類的兩個物件,那麼下述物件賦值語句 b a 就能把物件a的資料成員的值逐位複製給物件b 例3.2...

C 類物件的複製和賦值

例1.類物件複製,拷貝建構函式 includeusing namespace std class student void setname string str void getname private string m strname void student setname string str...