21天學通C++--閱讀筆記4(靜態成員、函數指針)

靜態成員變量

主要用於在類的實例間共享數據。作用域爲類。

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&);  //methodAmethodB具有相同的返回類型和參數

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;} //AB的友元類,即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常量,而常量不允許改變。

注:友元關係不能被繼承,且不能互通(AB的友元,但B不一定爲A的友元)。

 

規則:

A類使用B類的某些功能,且不訪問B類保護成員時,採用A類包容B類。

根據B類實現A類,且A類需要訪問B的保護成員時,採用A類私有繼承B類。

A類訪問B類的私有成員,採用友元類。

儘量不採用friend友元類,除非需要頻繁訪問另一個類中的數據。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章