過載運算子的規則

2021-08-02 05:00:04 字數 2316 閱讀 4646

不太熟悉的一些c++的運算子:

位運算子:^(按位異或)    ~(按位取反)

條件運算子(?:)

求位元組數運算子(sizeof)

過載運算子的規則:

1.不允許創造新的運算子,只能對已有的c++運算子進行過載;

2.c++不能過載的運算子只有6個「?:」、「.」、「::」、「sizeof」、」.*」和「typeid

(物件型別操作符)」

,以及不能對它們進行過載的原因如下:

在具體講解各個運算子不能過載之前,先來說明下【過載】:過載的本意是讓操作符可以有新的語義,而不是更改語法——否則會引起混亂。 

【注】過載的部分規則:運算子函式的引數至少有乙個必須是類的物件或者類的物件的引用。

(1).「?:」運算子,假如能夠過載,那麼問題來了,看下面的語句:

exp1?exp2:exp3
該運算子的本意是執行exp2和exp3中的乙個,可是過載後,你能保證只執行了乙個嗎?還是說兩個都能執行?亦或兩條都不能執行? 「?:」運算子的跳轉性質就不復存在了,這就是「?:」運算子不能夠被過載的最主要原因。

(2).「.」運算子,假如能夠過載,那麼,問題來了,看下面的例子:

class y ;

class x

void fun();

// ...

};void g(x& x)

「.」運算子的本意是引用物件成員的,然而被過載後就不能保證本意,從而帶來運算子意義的混淆,如果每個人都這麼過載,那更不容易學習c++語言了。

(3).「::」運算子,m::a,該運算子只是在編譯的時候域解析,而沒有運算的參與進來,由前面【注】重規則可知,如果過載之後,::運算子有了新的語義,那是不是會引起混淆呢?

(4).「sizeof」運算子,該運算子不能被過載的主要原因是內部許多指標都依賴它,舉例說明過載的後果:

​​a b[10];//a是類

a* p = &a[3];

a* q = &a[3];

p++;//執行後,p指向a[4],記住是指向a[4]!根據c++規定,該操作等同於p+sizeof(a),此時

​ //p應該比q大a類所佔位元組的大小,事實上,p並不一定會比q大這麼多,因為你把sizeof()運算

​ //符過載了啊!這時的sizeof(a)並不一定是該類占用的位元組大小!

(5)」.*」引用指向類成員的指標,下面是關於這個操作符的介紹:指向成員的指標運算子(.* 和 –>*)返回表示式左側上指定的物件的特定類成員的值。右側必須指定該類的成員。下面的示例演示如何使用這些運算子:需要注意的是雖然.*不能被過載,但是->*卻是可以被過載的。

由上面的程式可知,對於普通函式來說,函式名sum和&sum是一樣的,都是函式的首位址;所以d和s裡面的位址值是一樣的;

其實對於成員函式來說也是一樣的,void (testpm::*p)()=&testpm::_func1;和void (testpm::*p)()=testpm::_func1;這兩個程式的作用是一樣的,都是將函式的位址賦值給指標;

但是對於數值變數來說&是必須的,比如上面的_num資料,就必須加&才是取位址。

還有c++中如果想cout變數的位址,需要強制轉換變數名為數值型才可以、

3. 過載不能改變運算子運算物件(即運算元)的個數:唯一乙個三元運算子?:不能被過載

4. 過載不能改變運算子的優先級別

5. 過載不能改變運算子的結合性

6. 過載運算子的函式不能有預設的引數

7.過載運算子必須和使用者定義的自定義型別的物件一起使用,引數至少有乙個是類物件或其引用。

8. 過載運算子的功能應類似該運算子作用於標準型別資料時所實現的功能

對於上面的程式來說,對「+=」進行運算子過載時,之所以返回的物件是引用型別,是因為如果返回的是單純的complex型別的話,勢必會生成乙個新的物件,然後將當前已經被改變的物件複製給這個新的物件;但是如果用了引用型別,則不必生成新的物件,返回的直接就是當前已經被改變的物件。其實對於這個過載函式來說,即使返回值為void運算結果也是正確的,因為對於「+=」來說,比如a+=b,等價於a=a+b,因此這個運算子的最後運算結果就是a也就是當前物件,不需要生成乙個新的物件。

過載運算子

題目描述 定義乙個矩形類,資料成員包括左下角和右上角座標,定義的成員函式包括必要的建構函式 輸入座標的函式,實現矩形加法,以及計算並輸出矩形面積的函式。要求使用提示中給出的測試函式並不得改動。兩個矩形相加的規則是 決定矩形的對應座標分別相加,如 左下角 1,2 右上角 3,4 的矩形,與 左下角 2...

過載運算子

include include using namespace std class test test const int a v a test const test t1 v t1.v 以下過載小於號 比較兩個物件的大小 bool operator const test t1 const 比較物件...

過載運算子

1.當乙個過載的運算子是成員函式時,this繫結到左側運算物件。成員運算子函式的引數比運算物件的數量少乙個。非成員函式呼叫等價於 data1 data2 普通表示式 operator data1,data2 等價的函式呼叫成員函式呼叫等價於 data1 data2 普通表示式 data1.opera...