友元: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 ...