静态成员变量
主要用于在类的实例间共享数据。作用域为类。
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友元类,除非需要频繁访问另一个类中的数据。