本篇部落格講解:
運算子過載的規則,以及例項
被過載的運算子必須是已經存在的c++運算子,不能過載自己建立的運算子。
運算子被過載之後,原有功能仍然保留。只是擴充套件了原有功能。
過載不能改變運算子運算物件的個數。
+運算子具有兩個運算元,在+運算子函式作為類(例如上個例子中的ctime)的成員函式的時候,有乙個引數是隱含的,也就是當前的物件,使用this指標來引用。
另乙個引數通過函式引數指定。
可以過載的運算子:
1.算術運算子:+,-,*,/,%,
2.邏輯運算子:&&,||,!
3.關係運算子:>,<,=,>=,<=,==,!=
4.位操作符:~,<<(左移),>>(右移),&,^),|
5.自增自減運算子:++,--
6.復合賦值運算子:+=,-=,*=,/=,%=
7.其他:&(取位址符)、*、 () 、->(成員訪問運算子) 、 (下標運算子)、.new/delete、>>、<<
不能過載的運算子:
?:(條件運算子)
.(成員訪問運算子)
*(成員指標訪問運算子)
::(域運算子)
sizeof(sizeof 是運算子,而不是函式)
不需要過載的運算子
=(賦值)和&(取位址符)
因為編譯器會為每個類自動實現乙個預設的賦值運算子/取位址符的成員函式
當然,我們可以重寫這個預設的成員函式。
ctime& operator=(ctime& time);//返回的是物件的引用形式
ctime& ctime::operator=(ctime& time)
//預設的是各個成員分別賦值
m_nhour = time.m_nhour;
m_nminute = time.m_nminute;
m_nsecond = time.m_nsecond;
return *this;//返回當前這個物件
}
友元函式的運算子過載
//friend為友元函式的關鍵字,這個符號運算子過載函式的引數型別至少有乙個類型別或者類的引用,也就是說,可以有乙個引數不是物件
friend ctime operator+(ctime& time1, ctime& time2);
//友元函式的運算子過載
ctime operator+(ctime& time1, ctime& time2)
minute += (time1.m_nminute + time2.m_nminute);
if (minute > 60)
hour += (time1.m_nhour + time2.m_nhour);
if (hour > 24)
return ctime(hour, minute, second);
}
賦值函式
普通函式和類的成員函式都可以作為類的友元,但什麼時候應該使用普通函式,什麼時候應該使用成員函式方式呢?
普通函式形式的運算子函式一般都宣告為類的友元函式,用以訪問類的私有資料成員。
這樣可以減低開銷,但破壞封裝性。因此建議盡量使用成員函式形式。
一般將單目運算子過載為成員函式,將雙目運算子過載為友元函式
成員函式方式要求左側的引數要與類的型別相同。而普通函式則要求實參順序與形參型別順序一致。
如 有的運算子必須定義為類的成員函式
=、賦值運算子
、下標運算子
() 函式呼叫運算子
有的運算子不能定義為類的成員函式,只能定義為類的友元
<<、>>
運算子過載可以在函式內執行任意的操作,比如可以將+定義成兩個物件相減的操作
但是這樣違揹我們日常使用的習慣,容易使用誤用,減低程式可讀性,因此必須保證過載的運算子與該運算子應用於標準資料型別時所具有的功能。
本文源自【人生之旅_諳憶的部落格】
C C ,運算子過載
編輯運算子過載原始檔overload.cpp include using namespace std class complex complex double r,double i complex operator complex c2 void display private double rea...
C 運算子過載規則
運算子過載是通過函式過載實現的,下面我們來介紹一下運算子過載需要遵循的規則。1 並不是所有的運算子都可以過載。能夠過載的運算子包括 newnew delete delete 上述運算子中,是下標運算子,是函式呼叫運算子。自增自減運算子的前置和後置形式都可以過載。長度運算子sizeof 條件運算子 成...
C 運算子過載規則
運算子過載時要遵循以下規則 1 除了類屬關係運算子 成員指標運算子 作用域運算子 sizeof運算子和三目運算子 以外,c 中的所有運算子都可以過載。2 過載運算子限制在c 語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。3 運算子過載實質上是函式過載,因此編譯程式對運算子過載的...