概述:
除了前面過載的指標,自增自減,左移運算子之外,可以發生過載的運算子還有很多,比如等號(=),等等(==)以及(!=)等,
二、符號過載總結
三,字串類封裝
class
person
person
(int age1,
char
* name1)
person&
operator
=(person &p)
~person()
int age;
char
* name;};
void
test01()
intmain()
注意:
在不過載等號運算子的時候,如p1 = p2
編譯器會認為是簡單值拷貝 。
自定義物件等號的時候,不能簡單的進行每個成員變數都等於,如下
person&
operator
=(person &p)
這種過載是不對的,因為對於乙個陣列來說陣列名就是首位址,如果這樣直接複製,會導致兩個陣列訪問同一塊記憶體,導致一些難以預料的問題,所以在賦值的時候一定要重新開闢空間。並且要記得最後物件釋放的時候記得也釋放申請的空間
class
person
bool
operator
==(person& p)
bool
operator
!=(person& p)
int age;
string name;};
void
test01()
if(p1 != p2)
}int
main()
class
myadd
intoperator()
(int x,
int y)};
void
test01()
intmain()
對於這兩種運算子不太好過載,不能過載 operator&& 和 operator|| 的原因是,無法在這兩種情況下實現內建操作 符的完整語義。說得更具體一些,內建版本版本特殊之處在於:內建版本的&&和 ||首先計算左邊的表示式,如果這完全能夠決定結果,就無需計算右邊的表示式了- -而且能夠保證不需要。我們都已經習慣這種方便的特性了。 我們說操作符過載其 實是另一種形式的函式呼叫而已,對於函式呼叫總是在函式執行之前對所有引數進 行求值。
比如
if
(complex1 &&
(complex1 +
= complex2)
)
對於上述**來說計算判斷的時候,是按照先算括號裡面的,並不會從左開始判斷,並且如果complex1
為0就不會判斷的情況,所以會有一些問題,並不能達到我們想要的功能。
根據內建&&的執行順序,我們發現這個案例中執行順序並不是從左向右,而是先 右猴左,這就是不滿足我們習慣的特性了。由於 complex1 += complex2 先執行, 導致 complex1 本身發生了變化,如果初始值是 0,現在經過+=運算變成 1,1 && 1 輸出 了真。所以會有一些問題
=, , () 和 ->
操作符只能通過成員函式進行過載<< 和 >>
只能通過全域性函式配合 友元函式進行過載 不要過載&& 和 ||
操作符,因為無法實現短路規則 常規建議
乙個簡單的字串類的封裝,實現string的功能。
#define _crt_secure_no_warnings
#include
#include
#include
using
namespace std;
class
mystring
mystring
(const mystring& str)
~mystring()
}char
&operator
(int index)
//過載
//=號過載
mystring&
operator=(
const
char
* str)
this
->pstring =
newchar
[strlen
(str)+1
];strcpy
(this
->pstring, str)
;this
->m_size =
strlen
(str)
;return
*this;}
mystring&
operator=(
const mystring& str)
this
->pstring =
newchar
[strlen
(str.pstring)+1
];strcpy
(this
->pstring, str.pstring)
;this
->m_size = str.m_size;
return
*this;}
//字串拼接 過載+號
mystring operator+(
const
char
* str)
mystring operator+(
const mystring& str)
//字串比較
bool
operator==(
const
char
* str)
return
false;}
bool
operator==(
const mystring& str)
return
false;}
private
:char
* pstring;
//指向堆區空間
int m_size;
//字串長度 不算'\0'};
//左移運算子
ostream&
operator
<<
(ostream& out, mystring& str)
//右移運算子
istream&
operator
>>
(istream& in, mystring& str)
char buf[
1024];
//開闢臨時的字元陣列,儲存使用者輸入內容
in >> buf;
str.pstring =
newchar
[strlen
(buf)+1
];strcpy
(str.pstring, buf)
; str.m_size =
strlen
(buf)
;return in;
}void
test01()
else
}int
main()
運算子過載 賦值運算子的過載
有時候希望賦值運算子兩邊的型別可以不匹配,比如,把乙個int型別變數賦值給乙個complex物件,或把乙個 char 型別的字串賦值給乙個字串物件,此時就需要過載賦值運算子 注意 賦值運算子 只能過載為成員函式 賦值運算子過載例項示例 include include using namespace ...
C 運算子過載(四)
c 允許在自己的類中,或是在全域性作用域中重定義運算子的含義。由於很多物件導向的語言沒有提供這種能力,因此你可能會低估這種特性在c 中的作用。c 中運算子的概念十分廣泛,甚至包含 陣列索引 函式呼叫 型別轉換以及記憶體分配和釋放例程。可以通過運算子過載來改變語言運算子對自定義類的行為。能讓自己的類具...
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...