1) 访问控制符public, protected, private只在编译阶段访问控制。
也就是说运行时刻可访问private成员,用函数指针。
class FFF;
typedef void (FFF::*PFunc)();
PFunc pF;
class FFF
{
public:
FFF()
{
pF = &FFF::Print;
}
private:
void Print()
{
cout<<"hello"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
FFF f;
(f.*pF)();
return 0;
}
2) 应当只暴露客户程序需要的数据。原因如下:
l 不需担心客户程序会改变不该改变的数据,对客户来说更简单了,因为可以访问的东西变少了。
l 当作者需要改变内部数据结构时,不需担心会影响到客户程序,客户程序不需要改变。
3) 友员和封装是矛盾的,但是,有时候破坏封装是为了便于编程
l 普通友员
class A
{
public:
friend void GlobalFunc(); //全局函数, 可以访问private或
protected的成员
friend struct B; //结构体,可以访问private或protected
的成员
friend void C::ClassFunc();//类成员函数
可以访问private或protected的成员
};
注意:friend 放在public可以,放在private也可以,没啥关系。
l 嵌套友员
嵌套的结构不能访问private或protected的成员,需声明为友员。
1) 声明嵌套的结构
2) 声明友员
3) 定义嵌套结构
class A
{
struct B;
friend struct B;
struct B
{
};
};
注意:如果friend struct B {};则 B不是A的嵌套结构。
l 友员不能被继承和被传递
例子1:B是A的友员函数, 类C继承于A,B并不是C的友员函数。
例子2:B是A的友员,C是B的友员,C并不是A的友员。
4) 编译效率与可扩展性
.h文件
class A
{
class B;
B* pB;
};
.cpp文件
class A::B
{
void Func();
};
void A::B::Func()
{
}
将类定义到cpp中,可以提高可扩展性,当需要更改实现时,只需编译cpp,所有包含.h文件的cpp都
无需重新编译,因为.h接口不变。