C 的運算子過載(四) 其他運算子過載和總結

2021-10-10 10:28:42 字數 3761 閱讀 6561

概述:

除了前面過載的指標,自增自減,左移運算子之外,可以發生過載的運算子還有很多,比如等號(=),等等(==)以及(!=)等,

二、符號過載總結

三,字串類封裝

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 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...