#include
#include
using
namespace std;
class
a//拷貝建構函式a(
const a& other)
//運算子過載
a&operator+(
const
int num)
intget_number()
const
private
:int number;};
intmain
(void
)
#include
#include
using
namespace std;
class
a//拷貝建構函式a(
const a& other)
//使用友元運算子過載
friend a&
operator
+(a& other,
int num)
;int
get_number()
const
private
:int number;};
a&operator
+(a& other,
int num)
intmain
(void
)
區別:
\1. 使用成員函式來實現運算子過載時,少寫乙個引數,因為第乙個引數就是this指標。
兩種方式的選擇:
\1. 一般情況下,單目運算子過載,使用成員函式進行過載更方便(不用寫引數)
\2. 一般情況下,雙目運算子過載,使用友元函式更直觀
方便實現a+b和b+a相同的效果,成員函式方式無法實現。
例如: 100 + cow; 只能通過友元函式來實現
cow +100; 友元函式和成員函式都可以實現
特殊情況:
(1) = () [ ] -> 不能過載為類的友元函式!!!(否則可能和c++的其他規則矛盾),只能使用成員函式形式進行過載。
(2)如果運算子的第乙個運算元要求使用隱式型別轉換,則必須為友元函式(成員函式方式的第乙個引數是this指標)
注意:同乙個運算子過載, 不能同時使用兩種方式來過載,會導致編譯器不知道選擇哪乙個(二義性)
\1. 為了防止對標準型別進行運算子過載,
c++規定過載運算子的操作物件至少有乙個不是標準型別,而是使用者自定義的型別
比如不能過載 1+2
但是可以過載 cow + 2 和 2 + cow // cow是自定義的物件
2.不能改變原運算子的語法規則, 比如不能把雙目運算子過載為單目運算
\3. 不能改變原運算子的優先順序
\4. 不能建立新的運算子,比如 operator**就是非法的, operator*是可以的
\5. 不能對以下這四種運算子,使用友元函式進行過載
= 賦值運算子,()函式呼叫運算子,[ ]下標運算子,->通過指標訪問類成員
\6. 不能對禁止過載的運算子進行過載
*不能被過載的運算子*
成員訪問
.域運算
::記憶體長度運算
sizeof
三目運算
? : :
預處理#
可以被過載的運算子
雙目運算子
+ - * / %
關係運算子
== != < <= > >=
邏輯運算子
&& || !
單目運算子
+(正號) -(負號) *(指標) &(取位址) ++ –
位運算& | ~ ^ <<(左移) >>(右移)
賦值運算子
= += -= *= /= %= &= |= ^= <<= >>=
記憶體分配
new delete new[ ] delete[ ]
其他( ) 函式呼叫-> 成員訪問 [ ] 下標, 逗號
過載運算子
題目描述 定義乙個矩形類,資料成員包括左下角和右上角座標,定義的成員函式包括必要的建構函式 輸入座標的函式,實現矩形加法,以及計算並輸出矩形面積的函式。要求使用提示中給出的測試函式並不得改動。兩個矩形相加的規則是 決定矩形的對應座標分別相加,如 左下角 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...