修饰权限
- public 所有均可访问;
- private 类自己的成员函数或友元访问,不能被类对象、子类访问;(封装概念)
- protected 类自己、友元以及子类访问,不能被类对象访问;(继承概念)
- friend 友元,别人是你的朋友,他可以访问我的东西。(但不是我可以访问他的东西)
struct和class
- struct 缺省权限是 public, class 缺省权限是 private;
- C++ 中,只有成员变量很简单数量少才可能使用 struct;一般使用 class;
继承/派生
继承基类,在基类前省略 public 等时,默认是 protected 属性;
public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private;(不变)
protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private;(public变protected)
private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private。(public和protected变private)
派生类包含了基类所有成员以及新增的成员,同名的成员被隐藏起来,调用的时候只会调用派生类中的成员。
int main(){
B b(10);
cout << b.a << endl;//基类和子类同名,从子类对象调用,默认调用子类的成员
cout << b.A::a << endl;//调用B的基类A的同名成员
system("pause");
return 0;
}
友元关系
友元
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
友元函数声明和定义
- 要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend
- 声明类 ClassTwo 的所有成员函数作为类 ClassOne 的友元,需要在类 ClassOne 的定义中放置如下声明:
friend class ClassTwo;
class INTEGER
{
friend void Print(const INTEGER& obj);//声明友元函数
};
// 请注意:print() 不是任何类的成员函数,函数名前不加类声明符
void Print(const INTEGER& obj)
{
//函数体
}
void main()
{
INTEGER obj;
Print(obj);//直接调用
}
特点
- 友元关系不能被继承;
- 友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类 B 的友元,要看在类中是否有相应的声明;
- 友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一定是类 A 的友元,同样要看类中是否有相应的申明;
- 友元函数并不是类的成员函数,因此在类外定义的时候不能加上 class::function name;