c 學習心得第二期 友元 運算子過載

2021-10-09 23:41:03 字數 4623 閱讀 7104

二、運算子過載

在程式裡,有些私有屬性 也想讓類外特殊的一些函式或者類進行訪問,就需要用到友元的技術

友元的目的就是讓乙個函式或者類 訪問另乙個類中私有成員

友元的關鍵字為 friend

友元的三種實現

全域性函式做友元

類做友元

成員函式做友元

#include

using

namespace std;

#include

//全域性函式做友元

class

building

public

: string m_sittingroom;

private

: string m_bedroom;};

void

goodgay

(building *building)

intmain()

#include

using

namespace std;

#include

//類做友元

//還沒有寫building類在此處做乙個宣告,在goodgay中需要用到goodgay

//乙個類想訪問另外乙個類中的私有成員變數。

class

building

;class

goodgay

;class

building

;building::

building()

goodgay::

goodgay()

void goodgay::

visit()

intmain()

#include

using

namespace std;

#include

//成員函式做友元

class

goodgay

;class

building

;building::

building()

goodgay::

goodgay()

void goodgay::

visit()

void goodgay::

visit2()

intmain()

運算子過載概念:對已有的運算子重新進行定義,賦予其另一種功能,以適應不同的資料型別

作用:實現兩個自定義資料型別相加的運算

總結1:對於內建的資料型別的表示式的的運算子是不可能改變的

總結2:不要濫用運算子過載

#include

#include

using

namespace std;

class

person

person

(int a,

int b)

//成員函式實現+號運算子過載

person operator

+(person& p1)

public

:int m_a;

int m_b;};

全域性函式實現+號運算子過載

//person operator+(person& p1,person& p2)

////全域性函式和成員函式實現加號運算子過載

//全域性函式過載等同於 +operator(p1,p2)

//區域性函式過載等同於 p1.+operator(p2)

//最後的呼叫方式均可以簡化為 p3=p1+p2

void

test01()

//過載實現 p3=p2+10

person operator

+(person& p1,

int val)

void

test02()

//運算子過載可以實現函式過載

intmain()

作用:可以輸出自定義資料型別

總結:過載左移運算子配合友元可以實現輸出自定義資料型別

#include

#include

using

namespace std;

class

person

person

(int a,

int b)

//區域性函式不能實現左移運算子過載

//void operator<<(ostream& cout)

//結果是 p:int m_a;

int m_b;};

//全域性函式實現左移過載

ostream&

operator

<<

(ostream& cout, person& p1)

void

test01()

//運算子過載可以實現函式過載

intmain()

通過過載遞增運算子,實現自己的整型資料

#include

#include

using

namespace std;

class

myinteger

//實現前置++

//返回的是本身 因此可以使用引用作為返回值

myinteger&

operator++(

)//實現後置++ 使用佔位形式引數形成函式的過載

//返回的是函式內的成員變數,因此需要返回數值,不能返回引用。

myinteger operator++(

int)

private

:int num;};

//左移函式過載

ostream&

operator

<<

(ostream& cout,myinteger& myint)

//實現 前置++運算的過載

void

test01()

//實現 後置++運算的過載

void

test02()

intmain()

c++編譯器至少給乙個類新增4個函式

預設建構函式(無參,函式體為空)

預設析構函式(無參,函式體為空)

預設拷貝建構函式,對屬性進行值拷貝

賦值運算子 operator=, 對屬性進行值拷貝

如果類中有屬性指向堆區,做賦值操作時也會出現深淺拷貝問題

#include

#include

using

namespace std;

class

person

//在結束時刪除開闢的堆區

~person()

}//重複值運算子 深拷貝應用 拷貝構造

person&

operator

=(person& p1)

this

->age =

newint

(*p1.age)

;return

*this;}

int*age;};

void

test01()

intmain()

**作用:**過載關係運算子,可以讓兩個自定義型別物件進行對比操作

#include

#include

using

namespace std;

class

person

//過載== 成員函式過載只能傳入乙個引數

bool

operator

==(person& p1)

else

}//過載 實現!=

bool

operator

!=(person& p1)

else

}int m_age;

string m_name;};

void

test01()

else

if(p1 != p2)

else

}int

main()

函式呼叫運算子 () 也可以過載

由於過載後使用的方式非常像函式的呼叫,因此稱為仿函式

仿函式沒有固定寫法,非常靈活

#include

#include

using

namespace std;

class

myprint};

void

test01()

class

myadd};

void

test02()

intmain()

C 友元運算子過載函式

運算子過載函式 實現物件之間進行算數運算,實際上是物件的屬性之間做運算 包括 加號 減號 負號 正號 運算子過載函式分為 普通友元運算子過載函式 成員友元運算子過載函式 成員運算子過載函式 運算子運算子過載函式按運算型別為 雙目運算子過載函式,如加 減 乘 除 賦值 單目運算子過載函式 自加 自減 ...

c 筆記 運算子過載和友元

過載的作用機理 過載的區別 成員函式與非成員函式 友元運算子過載是一種形式的c 多型,過載的概念擴充套件到了運算子上,允許賦予c 運算子多種含義,允許將運算子過載擴充套件到使用者定義的型別。編譯器將根據運算元的數目和型別決定使用哪種加法定義。過載的運算子 有些例外情況 不必是成員函式,但必須至少有乙...

c 過載運算子 友元函式

運算子的過載使得我們可以更加方便的使用常見的運算子進行操作。過載運算子的函式格式如下 operatorop argement list 接下來的例子中,我們將定義乙個time類,並通過過載運算子 和 來實現時間的加法和輸出顯示,其中會使用友元函式 friend ifndef time h defin...