类的访问控制
类中主要有两部分
成员函数
成员变量
分三个级别
+ public
+ protected
+ private
定义一个简单的类A
class A{
private:
int a=0;
public:
int b=1;
void cout_a();
protected:
int c=2;
};
void A::cout_a(void)
{
cout<<"a"<<a<<endl;
}
这里
public可以被实例(类的对象)访问
protected和private则不可以被外部访问
二者区别为protected可以被子类访问,但是private只能被内部接口访问
对于一个对象
A a
cout<<a.a<<a.b<<a.c<<endl;
编译器会报错
error: 'int A::a' is private
error: 'int A::c' is protected
但是我们可以通过内部接口cout_a来访问A::a
a.cout_a();
这就是所谓的隐藏实现,访问控制
这里有两方面考虑
一是让客户端程序员无法触及他们不应该触及的地方,防止类被修改
二是类的设计者可以任意修改类内部的实现方式而不影响客户端程序员
类的继承
继承方式
多重继承
继承的访问限制
虚函数
类的构造
静态变量
友元函数
这里重新强调一下三种访问权限
public:可以被任意实体访问,包括该类中的函数,子类中的函数,友元函数以及该类的对象访问
protected:只允许子类及本类的成员函数以及友元函数访问,该类对象不可以访问
private:只允许本类的成员函数,以及其友元函数访问,不可被子类中的函数以及对象访问
除此以外强调一下三种继承方式
Tables | public: | protected: | private: |
---|---|---|---|
public继承 | public | protected | x |
protected继承 | protected | protected | x |
private继承 | private | private | x |
意味着public继承的时候,原有的父类的public还是piblic,protected还是protected,但是private不可以访问了
举个例子
class B:public A{
public:
void cout_c();
};
void B::cout_c()
{
cout<<"c"<<c<<endl;
cout<<"a"<<a<<endl;
}
B b;
b.cout_c();
则会报错
error: 'int A::a' is private
不可以被子类的成员函数访问,而c却可以被子类成员函数访问
这时候需要将cout_c中的对a的访问注释掉
然而需要注意的是,继承之后,cout_a()函数还是public,还是可以访问的。并且通过cout_a()这个父类的函数接口可以访问a这个成员变量。但是,这是当B类中没有定义该函数的情况下才可以实现的,调用的是A中的cout_a()
举个例子
void A::cout_a(void)
{
cout<<"a"<<a<<endl;
cout<<"b"<<b<<endl;
}
class B:public A{
int b=10;
public:
void cout_c();
};
B b;
b.cout_a();
此时输出的a和b是A类中定义的值,而不是b=10