賦值運算子過載即便不寫,編譯器也會預設自動生成,完成正常賦值。
class date
date(const date& d)
private:
int _year;
int _month;
int _day;
};int main()
class date
date(const date& d)
void operator=(const date& d1)
}private:
int _year;
int _month;
int _day;
};int main()
當自己定義賦值運算子過載後,編譯器就會對其進行呼叫,而不會再預設生成。在此,以成員函式的形式實現,由於不需要自己給自己賦值,在函式內部做一步判斷即可。現在單步賦值能夠進行,但是不能夠連續賦值,**需要進一步優化。
賦值是從右向左進行賦值的,d3 = d2 = d1進行連續賦值時,d2 = d1賦值完畢後返回void。此時再進行賦值時,this相當於&d3,而d相當於void。那麼就變成了d3 = void,即出錯。在此應該用d2給d3進行賦值,應該傳入上一次this指標指向的位置。即在最後應該傳入*this,即應該return *this;
class date
date(const date& d)
date& operator=(const date& d1)
return *this;
}private:
int _year;
int _month;
int _day;
};int main()
int main()
對於d4來講,它還不存在,得先構造乙個物件,而構造的內容就是d1,相當於把d1內容拷貝過來。所以呼叫拷貝建構函式。
明確一點:對於沒有存在的物件,首先都需要呼叫建構函式對其進行建立。而賦值用於已經存在的物件中,改變已經存在的物件的內容。
賦值運算子主要有四點:
1)引數型別,引數傳值、傳引用均可,它區別於拷貝構造,不會引發無窮遞迴。傳值的話就進行一次拷貝,傳引用的話就是外面物件本身,效率高一些。
2)返回值,返回*this,用於連續賦值。如果不想連續賦值返回void也沒有關係。
3)檢測是否自己給自己賦值。若對於指標來講,或是有資源分配的情況下,如若未檢測自己給自己賦值,可能會產生野指標。
4)返回*this。
5)乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝(賦值運算子過載,其實與拷貝建構函式很相似,它也是乙個拷貝,編譯器所預設生成的過載函式也存在淺拷貝的問題,遇到string類得自己進行實現了,針對date類採用預設的即可)。
預設賦值運算子針對string類引發淺拷貝問題:
// 這裡會發現下面的程式會崩潰掉?這裡就需要我們以後講的深拷貝去解決。
class string
~string()
private:
char* _str;};
int main()
有申請資源的操作,需要自己定義這兩個成員函式。沒有的話可以採用編譯器預設生成的函式進行使用,否則會產生淺拷貝雙層析構的問題。 C 系列 20 運算子過載
然而,單純的使用系統自帶的 來進行來兩個物件的相等判斷,是無法通過編譯的。在此我們可以採用建立乙個判斷相等函式用以解決兩個物件的相等判斷 class date date const date d bool isequal const date d1 private int year int mont...
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...