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友元类,除非需要频繁访问另一个类中的数据。

 

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