操作符過載注意點 C

2021-07-31 12:12:44 字數 1954 閱讀 9628

a、二元運算子的引數只有乙個,一元運算子不需要引數。之所以少乙個引數,是因為這個引數是隱含的

b、指標操作符「->」、下標操作符「」、函式呼叫操作符「()」和賦值操作符「=」只能以成員函式的形式過載

a、二元操作符需要兩個引數,一元操作符需要乙個引數。不管如何,必須要有乙個引數是類型別物件(防止過載內建型別操作);

b、若左運算元是非類型別,則必須宣告為全域性函式;

c、一般情況下,過載運算子函式要用到 類的私有變數,所以我們將該函式宣告為該類的友元函式

要確定它的返回值是左值,還是右值。如果是左值最返回引用,如果是右值那就直接返回

後增(a++):

整數形參,值返回

t operator++(int)

前增(++a):

沒有形參,引用返回

t& operator++()

(1)型別轉換建構函式可以完成其它型別到類型別的轉化,過載型別轉換可以完成從類物件到其他型別的轉換

注意:沒有引數,沒有顯示標出返回型別(型別名就表示了返回型別),函式內只能返回要轉換的型別物件

class x

};

(2)

一般來說,轉換運算子與轉換建構函式(即帶乙個引數的建構函式)是互逆的,如有了建構函式test(int),那麼最好有乙個轉換運算子int()。

這樣就不必提供物件引數過載運算子了,如

test a1(1);

test a2(2);

test a3;

a3 = a1+a2;

就不需要過載+號操作符了。

因為對於a1+a2的運算,系統可能會先找有沒有定義針對test的+號操作符,如果沒有,它就會找有沒有針對test類轉換函式引數型別的+號操作符

(因為可以將+號執行結果的型別通過轉換函式轉換為test物件),因為test類有個int型別的引數,對於int型別有+操作符,所以a1+a2真正執行的是

test(int(a1) + int(a2));即test(3)

(3)對於轉換運算子,還有乙個需要注意的地方就是,如果a類中有以b為引數的轉換函式(建構函式),那b中不能有a的轉換運算子,不然就存在轉換的二義性,如:

class a

}; class b

};// 那麼以下語句就會有問題:

b b;

a(b); //a(b)有就可能是a的建構函式,也可以是b的轉換運算子

正如可以進行如下的操作

int x, y, z;

x = y = z = 2;

賦值採用右結合律,上式會被編譯器解析為:

x = ( y = ( z = 2 ) );
相當於2首先賦值給z,然後整個表示式(z = 2)返回 z,再把 y 賦值為 z。

所以,為了同樣實現連鎖賦值,賦值操作符應當返回乙個 reference 指向操作符的左側實參。如下所示:

class a 

};

t& operator+=(const t& rhs);

t& operator-=(const t& rhs);

函式最後都應當返回乙個指向該操作符左引數的引用:

return *this;

C 操作符過載

1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...

C 過載操作符

過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...

c 操作符過載

過載操作符 一 限制 1 不能增加新的操作符 2 有些操作符不能過載,如.物件中的訪問成員 作用域解析操作符 sizeof 三元操作符 3 不能改變操作符的元數,元數是指與操作符相關的引數或運算元個數。比如一元操作符 只能應用於乙個操作符 4 不能改變操作符的優先順序 5 不能重新定義內建型別的操作...