靜態成員變量
主要用於在類的實例間共享數據。作用域爲類。
class A {static int staticParam;}
intA::staticParam = 0;//靜態成員變量初始化,在類的構造函數之外初始化
訪問方式:
public: static int staticParam; |
A::staticParam ; |
private: static int staticParam; |
A a; a.staticParam ; |
靜態成員函數
作用域爲類。
class A {static int staticMethod();}
A::staticMethod();//通過類調用
A a;a.staticMethod();//通過對象調用
注:靜態成員函數沒有this指針(作用域爲類),所以不能聲明爲const。且,類的普通成員變量在類函數中是通過this指針訪問的,所以,靜態成員函數不能訪問非靜態成員變量。
函數指針
int * pFunc(int); |
//返回int類型的指針,pFunc是函數名 |
int (*pFunc)(int); |
//返回int類型的變量,pFunc是指向函數的指針 |
使用:(可用於在不同情況調用不同的函數)
intmethodA(int&);
intmethodB(int&);
//函數指針
int(*pFunc)(int&); //與methodA和methodB具有相同的返回類型和參數
pFunc =mehtodA;
pFunc(0); //調用methodA方法
//函數指針數組
int(*pFunc[5])(int&);
pFunc[0] =mehtodA;
pFunc[1] =mehtodB;
if(pFunc[0] !=0) pFunc[0](0);
//函數指針做參數
int (*pFunc)(int&);
pFunc =methodA;
void callFunc(int (*pFunc)(int&), int &){
pFunc(0);
}
callFunc(pFunc,0);//調用
//typedef定義函數指針類型
typedef int (*VPF)( int &);
void callFunc(VPF, int &);
VPF pFunc =methodA;
callFunc(pFunc,0);
成員函數指針
class A {
virtual void methodA() const = 0;
virtual void methodB() const = 0;
}
//成員函數指針
void(A::*pFunc)() const = 0;
pFunc =mehtodA;
A *a;
(a->*pFunc)();
//成員函數指針數組
typedefvoid (A::*VPF)() const;//類外定義
VPF pFunc[2] ={A::methodA, A::methodB};
A *a;
(a->*pFunc[0])();
注:無需對pFunc進行delete,因爲pFunc指向代碼,需要delete的是自由存儲區的對象。
類包容、公有繼承、私有繼承、友元類
類包容:A類中有B類對象作爲成員變量。
class A { Bb;}
友元類:
classB{friend class A;} //A是B的友元類,即A可訪問B中的私有成員
友元函數:
class B{
friend void methodB();//不是B類的成員函數,methodB可訪問B類中的私有成員
friend void A::methodA();//A::methodA可訪問B類中的私有成員
}
應用:
friend ostream& operator<<(ostream & out, B &b);
ostream &operator<<(ostream & out, B &b){
out<<b.privateData;
return out;
}
B b;
cout<<b;
注:const常量不能進行運算符操作,因爲會改變const常量,而常量不允許改變。
注:友元關係不能被繼承,且不能互通(A爲B的友元,但B不一定爲A的友元)。
規則:
A類使用B類的某些功能,且不訪問B類保護成員時,採用A類包容B類。
根據B類實現A類,且A類需要訪問B的保護成員時,採用A類私有繼承B類。
A類訪問B類的私有成員,採用友元類。
儘量不採用friend友元類,除非需要頻繁訪問另一個類中的數據。