過載賦值運算子和加號運算子中const 的作用是什麼?

時間 2021-07-09 19:30:16

1樓:王浩

一、函式形參為非const、非引用:Box operator+(Box abox)

呼叫者box1為非const,實參box2為非const

Boxoperator+(

Boxabox

)Box

operator+(

Boxabox

)int

main

()呼叫者box1為非const,實參box2為const:

intmain

()和上一種情況沒啥區別,當然可以通過

呼叫者box1為const,實參box2為const或非const:

intmain

()不能通過!

原因:const物件不能呼叫非const成員函式。因為編譯器會認為任何乙個沒有被指定為const的成員函式都有可能修改呼叫者的屬性。

修改方式:把過載+運算子的函式指定為const:

Boxoperator+(

Boxabox

)const

二、函式形參為const、非引用:Box operator+(const Box abox)

形參為const並沒有為引數傳遞帶來任何限制,只是不能在函式體中修改右值。所以box1和box2的限制和1中是一樣的。

三、函式形參為非const、引用:Box operator+(Box& abox)

注意:引數為引用型別帶來的限制是,實參不能為const型別。因為編譯器認為如果把乙個const變數按引用傳入函式,這個const變數有可能在函式中被修改。

所以box2不能被指定為const型別,只能是非const型別。至於box1是否可以被指定為const型別,還是取決於過載+運算子的函式是否被指定為const型別。

四、函式形參為const、引用:Box operator+(const Box& abox)

此時編譯器知道實參在函式中不會被修改,所以傳入的實參(即box2)允許是const型別了。

總結:box1能否是const型別,取決於過載運算子的函式是否被指定為const

box2能否是const型別:

在按值傳送的情況下,沒有區別,都可以

在按引用傳送的情況下,要求形參是const&,box2才能是const

補充:按引用傳送相比於按值傳送的好處是,除了可以在函式中修改實參外,還可以在傳送的過程中除去複製臨時變數的步驟,節省時間。

綜上,最好的過載函式寫法為:

Boxoperator+(

Boxabox

)const

按引用傳送可以節省時間;

引數中的const告訴編譯器不會在函式中修改實參,所以box2可以為const;

後乙個const告訴編譯器在函式中不會修改呼叫函式的物件,所以box1可以為const。

C 過載運算子如何確定運算子位置?

可以表示兩種運算元 加法或正。a a b 這兩個 是不同的。Struct const operator Struct const value Struct const operator Struct const v1,Struct const v2 a 等同於 operator a a b 等同於 ...

c 如何判定 是位運算子還是插入運算子

白東傑 C 中的 移位運算子 是乙個二元運算子,內建情況下的作用是把左側物件左移 位,是右側物件。3u 2 把 11 2 左移兩位,這個表示式的值是 1100 2,即 12 10。對 自定義型別 如 struct,class 等 可以自定義運算子的意義,叫作 運算子過載 std ostream op...

c 怎麼實現兩個類之間的過載賦值運算子

建議學習std chrono基於std ratio實現的自動單位轉換。template Type class Ratio struct Mass 轉換建構函式 template Type2 class Ratio2 class NewRatio std ratio divide Ratio2 Mas...