友元及操作符過載

2022-08-28 13:36:16 字數 4120 閱讀 5970

友元:c++

控制類物件私有部分的訪問,但有時候需要在類的外部訪問類的私有成員,這種情況下

c++提供了友元機制。

友元函式,友元類;宣告為某一類(class 1

)的友元函式(

test

()),或則友元類(

class 2

)後,在

test

() ,或則

class 2 

中可以訪問

class 1 

的私有成員。

在類裡面宣告:eg)   friend void test();   friend class demo;   注意,定義時不需要使用friend關鍵字.

友元只是面對面的關係,也就是只能一層,友元的友元關係不成立。

兩個類可以互為友元,但是友元關係是單向的

左值和右值的去別,左值能取位址,右值不能。

建立友元函式步驟:

1,將函式宣告放到類的宣告中,並在原型前加上關鍵字

friend

friend 返回值 函式名稱

(引數列表

);friend class classname;

2、編寫友元函式定義,不需要在定義中使用關鍵字

friend

。friend int 友元函式名

(const classname &a);

操作符過載

操作符過載規則 

可以過載的操作符:

+ - * / % ^ & | ~

! = < > += -= *= /= %

^= &= |= << >> >>= <<= == !=

<= >= && || ++ -- ->* 『 ->

() new delete new delete

不能過載的算符  

.      ::      .*      ?:       sizeof

過載操作符函式可以對操作符作出新的解釋,但原有基本語義不變:

不改變操作符的優先順序

不改變操作符的結合性

不改變操作符所需要的運算元 

不能建立新的操作符

操作符函式是一種特殊的成員函式或友員函式

成員函式的語法形式為:

型別   類名  ::  operator  op ( 

參數列 

)// 相對於該類定義的操作

賦值操作符過載用於物件資料的複製 

operator= 必須過載為成員函式 

void operator = (const classname &it);

classname &operator = (const classname &it);

返回引用會支援如下語法obj1 = obj2 = obj3;

過載+-*/

運算操作符操作符

classname operator +(const classname &a) 一元

classname operator + (const char *s, const classname str) 二元

過載+=

運算操作符操作符

void operator +=(const classname &a)

<<\>>操作符過載

void operator <<(const classname &b)(一元

)classname operator <<(classname &a, const classname &b)(二元

)void operator >> (class &a)

++\--操作符過載

classname operator ++ (int),類成員函式過載

++--

必須帶乙個

int引數,

int僅供編譯器識別,實際呼叫的時候不需要任何引數傳遞。

在**當中不但要使用object++,

還需要使用

++object

的語法,所以需要定義乙個非類成員函式的

++過載,語法如下:

classname operator ++ (classname &a),非類成員函式過載

++--

必須帶乙個指向類例項引用的引數。

new/delete操作符過載

過載new

和delete

必須再關鍵字

operator

和操作符之間留下空格,及如下形式:

operator new

過載new

第乙個引數一定是

size_t

型別引數,函式必須返回無型別指標。

過載delete

第乙個引數一定是乙個無型別的指標,函式必須沒有返回值。

new/delete操作符過載案例

void *operator new(size_t size)

classname *p = (classname *)malloc(size);

return p;

void operator delete(void *object)

free((classname *)object);

object = null;

過載new,delete

void *operator new(size_t size)//size總比實際分配空間大

4個位元組

, 存放一些系統內部的處理資料

,也就是

delete

釋放記憶體時所需要的資料。

void *operator new(size_t size)

classname *p = (classname *)malloc(size);

return p;

void operator delete(void *object)

free((classname *)object);

object = null;

關係操作符==

過載bool operator == (const abc &a);//類成員函式過載

==操作符

bool operator == (const clasname &a1, const classname &a2);///非類成員函式過載

==操作符

下標操作符

過載int operator(int i);//返回

int型

int &operator(int i);//支援

object[1] = 8

語法函式呼叫操作符()

過載返回型別 operator () (引數1

,引數2)

int operator()()//過載無引數的

()操作符,返回

int型

int operator()(int i) //過載乙個

int型引數的

()操作符,返回

int型

.位址操作符*/&

過載int operator * ()//過載

*操作符,返回

intint *operator & ()//過載

&操作符,返回

int *.

自動轉換和強制型別轉換

c++將乙個型別賦值給另乙個型別是,如果這兩種型別相容,那麼

c++會自動將這個值轉化為接收變數型別。

當c++

不能自動轉化的時候,需要強制轉化

classname a;

int *p = (int *)a;//強制轉化失敗,因為

a是物件例項名稱,

c++無法實現將物件例項名稱轉化為

int *

強制轉化操作符過載

c++不但允許過載運算操作符,還可以過載強制型別轉換操作符,不過強制型別轉換必須是

c++基本資料型別之一,如

int,

float,char *

等,強制型別轉換注意以下幾點:

1、定義函式時不允許有引數,不允許有返回型別,但函式必須返回所需型別的值

2、過載函式只可以是類成員函式,不可以為非類成員函式

強制轉化操作符過載例子

operator int()

return 整形變數

;operator int* ()

return 整形變數位址

;

C 之過載操作符與友元

操作符過載c 多型的一種形式。過載函式形式 operator op argument list 其中op是操作符,操作符過載限制 1.過載後的操作符必須有至少乙個使用者自定義的型別 防止使用者為標準型別過載操作符 譬如不能過載操作符 去做double型別的減法 2.使用操作符不能違反原操作符的語法規...

C 友元過載輸出操作符(下篇)

假設trip是乙個time物件。為顯示time的值,可以使用show 函式,然而,如果可以像下面這樣操作更好 cout trip make cout recognize time class?解釋 是可以被過載的c 運算子之一。cout是乙個 ostream 物件,它是智慧型的,能夠識別所有的c 基...

有的操作符過載函式只能是友元函式

運算子過載為成員函式,第乙個引數必須是本類的物件。而 和 的第乙個運算元一定是ostream型別,所以 只能過載為友元函式。1 只能為友元 輸入流操作 輸出流操作 1 includeusing namespace std class test private int a int b ostream ...