C 賦值運算子過載

2021-10-05 14:22:37 字數 1660 閱讀 1453

c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值類 型,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。運算子過載可以讓編譯器按照指定的規則對自定義型別物件直接進行一些運算子操作。

函式名字為:關鍵字operator後面接需要過載的運算子符號。

函式原型:返回值型別 operator操作符(引數列表)

class date

bool operator>(const date& d)

bool operator==(const date& d)

bool operator!=(const date& d)

private:

int _year;

int _month;

int _day;

};

1 不能通過連線其他符號來建立新的操作符:比如operator@ 過載操作符必須有乙個類型別或者列舉型別的運算元 

2 用於內建型別的操作符,其含義不能改變,例如:內建的整型+,

3 不能改變其含義 作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的 操作符有乙個預設的形參this,限定為第乙個形參

4.* 、:: 、sizeof  、?:   、.注意以上5個運算子不能過載。。 

賦值運算子中重要的一點:乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的淺拷貝。

淺拷貝在不涉及資源管理的類中不存在問題,但是若是類中涉及資源管理就會造成兩個物件公用一塊記憶體空間,在物件的生命週期結束時,同乙份資源多次釋放而導致的**崩潰

class date		

private:

int _year;

int _month;

int _day;

};int main()

在date類中不涉及資源管理所以可以不用顯式的給出賦值運算子過載函式,編譯器會自動生成乙個,這裡d1呼叫的編譯器生成operator=完成拷貝,d2和d1的值也是一樣的,但是在涉及資源管理的就不可以

class string

~string()

private:

char* _str; };

int main()

在這種涉及資源管理但是沒有顯式的給出賦值運算子過載,編譯器就會自動生成預設的賦值運算子過載函式,就會發生淺拷貝,後果就是**崩潰

以date類為例給出它的賦值運算子過載函式

date& operator=(const date& d)//賦值運算子過載

//引數 :選擇使用引用傳參 : 傳參的效率高

return *this;

//返回值, 一定要有返回值,否則不能連續賦值

//a=b=c;----> c--->b b---->a

}

注意:

引數:傳引用,效率高

返回值:返回*this,否則不能連續賦值

檢測是否自己給自己賦值

C 運算子過載賦值運算子

自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...

C 賦值運算子過載

c 賦值運算子過載,為什麼要返回引用?查了許多資料,基本有兩種說法 一 c c 賦值運算子的本意為 返回左值的引用 左值 賦值號左面的變數而非其值 可用以下程式段測試 int a,b 3,c 2 a b c cout 對於x y x,y均為物件時 若不返回左值的引用,將會生成臨時物件。如果不處理x ...

C 過載賦值運算子

c 類建立時,會產生乙個預設的賦值運算子函式 a operator const a 普通類例項之間賦值可能沒問題,但當類成員變數中有指標引用的動態記憶體時,複製後只是簡單地將指標值複製,而沒有將其指向的動態記憶體也拷貝乙份,這樣即多個類例項內的指標指向同一動態記憶體,當類例項析構時,會導致這塊動態記...