/*
達內學習 C++ day51 2013-11-13
*/
回憶:
一,一元運算符 - ++ -- ~ !(默認左邊)
#R
R對象類型中着到一個成員函數 operator#()
找不到的化就去全局找 operator#(R對象類型)
L# ++ --
L對象類型中着到一個成員函數 operator#()
找不到的化就去全局找 operator#(R對象類型,int)
二,運算符重載的限制
1,不是所有的運算符都能重載
:: . .* ?: sizeof typeid
2,不能對基本類型運算符重載
至少有一個是類類型
3,不要改變運算級的特性(優先級等)
4,不能發明新的運算符,只能對已有的運算符重載
5,只能作爲成員的運算符
= [] () -> *
三,只能作爲成員運算符的舉例
1,= []
=要和構造函數 析構函數 拷貝構造函數一起考慮
=實現重載時 類型& operator=()
防止自賦值 是否自己的內存 注意返回值
類型 operator[](int ind);
2,小括號運算符
1,函數對象 把一個對象像函數一樣使用
返回值類型 operator()(參數列表);
2,小括號做類型轉換
operator 類型();
3,-> * 智能指針
地址 operator->();
對象->函數(); 對象.operator->()->函數();
對象類型& operator*();
四,new delete
void* operator new(size_t size);
void operator delete(void* ptr);
五,類型轉換
如果一個類型有一個單參的構造函數 則允許這個單參類型的變量轉換成這個類類型的變量
class A
{
public:
explicit A(B b){}
};
把A 類型轉換 B 類型
重載() 運算符
//===============
面向對象
1,面向對象編程的特徵
抽象,封裝,繼承,多態
2,封裝
該公開的公開,該私有的私有 public private
目的:隱藏細節
好處:便於分工協同開發,防止不必要的擴展
單例模式
3,繼承
a,把一個類的數據 傳承到下一個類
代碼複用 可以得到父類的一切
b,擴展(字類具備父類的一切,但又擴展了父類)
任何一個子類都可以看成是父類
c,如何做到繼承
一個類 繼承 另一個類
class A{}; class B:public A{};
d,繼承 和 組合
f,繼承的方式
public 繼承 公開繼承
protected 繼承 保護繼承
private 繼承 私有繼承
公開繼承:
如果父類中的數據權限是公開的則被繼承到子類中也是公開的;如果父類中的數據權限是保護的,則被繼承到子類中權限是保護的;如果父類中的數據是私有的,則被繼承到子類中權限是隱藏的。
保護繼承 :
公有變保護 保護繼承不變 私有的隱藏
私有繼承:共有變私有,保護變私有,私有變隱藏
總結:繼承方式就是給子類的最大的權限
public 成員 在子類中變得和繼承方式一致
protected 成員 除了私有繼承爲 private 其他還爲 protected
private 成員 所有繼承方式都爲隱藏
g,如果是私有繼承 如何訪問父類數據
如果子類中父類的數據權限是私有的,則在子類中公開一個接口。
如果在子類中父類的數據權限是隱藏的,則在父類中開一個接口,再在子類中開一個訪問接口。
h,父類中的 構造函數 拷貝構造函數 析構函數 賦值運算符 不能繼承到子類中,但是子類中可以調用這些函數。
子類默認調用父類的無參構造函數 和 析構函數。
構建子類對象掉用父類構造函數再調用子類的析構順序相反。
父類構造->子類構造->析構子類->析構父類
如果子類中 要指定調用父類的某個構造函數需要使用初始化列表 指定調用。
i,拷貝構造函數 和 賦值運算符的調用
子類默認調用父類的拷貝構造函數 和 賦值運算符函數。
一旦自定義之後就需要手動調用。
拷貝構造函數在初始化參數列表中調用
賦值運算符要防止遞歸,需要在函數名前加 父類名::operator=(子對象);
j,繼承中的數據隱藏
當數據繼承到子類之後 子類中如果定義了和父類數據同名的數據 則會把父類的數據隱藏掉
如果使用被隱藏的 父類名::數據名;
4,多重繼承