二、運算子過載
在程式裡,有些私有屬性 也想讓類外特殊的一些函式或者類進行訪問,就需要用到友元的技術友元的目的就是讓乙個函式或者類 訪問另乙個類中私有成員
友元的關鍵字為 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...