下面介紹類的賦值運算子
1.c++中物件的記憶體分配方式
在c++中,物件的例項在編譯的時候,就需要為其分配記憶體大小,因此,系統都是在stack上為其分配記憶體的。這一點和c#完全不同!千 萬記住:在c#中,所有類都是reference type,要建立類的實體,必須通過new在heap上為其分配空間,同時返回在stack上指向其位址的reference.
因此,在c++中,只要申明該例項,在程式編譯後,就要為其分配相應的記憶體空間,至於實體內的各個域的值,就由其建構函式決定了。
例如:classaa(
intid,
char
*t_name)
private:
char *name;
int _id;
}int
main()
在程式編譯之後,a和b在stack上都被分配相應的記憶體大小。只不過物件a的域都被初始化,而b則都為隨機值。
其記憶體分配如下:
2. 預設情況下的賦值運算子
如果我們執行以下:
b=a;
則其執行的是預設定義的預設的賦值運算。所謂預設的賦值運算,是指物件中的所有位於stack中的域,進行相應的複製。但是,如果物件有位於heap上的域的話,其不會為拷貝物件分配heap上的空間,而只是指向相同的heap上的同乙個位址。
執行b=a這樣的預設的賦值運算後,其記憶體分配如下:
因此,對於預設的賦值運算,如果物件域內沒有heap上的空間,其不會產生任何問題。但是,如果物件域內需要申請heap上的空間,那麼在析構物件的時候,就會連續兩次釋放heap上的同一塊記憶體區域,從而導致異常。 ~
a()
3.解決辦法--過載(overload)賦值運算子
因此,對於物件的域在heap上分配記憶體的情況,我們必須過載賦值運算子。當物件間進行拷貝的時候,我們必須讓不同物件的成員域指向其不同的heap位址--如果成員域屬於heap的話。
因此,過載賦值運算子後的**如下:
classaa(
intid,
char
*t_name)a&
operator=(a
&a)//注意:此處一定要返回物件的引用,否則返回後其值立即消失!
~a()
int_id;
char
*name;};
int main()
來自:
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
過載賦值運算子
1 注意過載賦值運算子和,運算子必須定義為類的成員函式。2 注意 如果程式不提供顯示的賦值運算子則系統會提供乙個預設的賦值運算子。3 什麼時候過載賦值運算子 當類中含有指標成員時,一般都要重定義類的賦值運算子。4 過載賦值運算子時應有處理語句m m的情況。其中m是某乙個類的物件。如果不處理這樣的語句...