在 C++ 中,所有的 成员变量 和 成员函数 都有访问权限,所谓的访问权限,就是我们到底能不能访问该类中的成员变量和成员函数。
C++ 中,用来控制访问权限的 关键字 有 public、protected 和 private,它们分别表示公有的、受保护的和私有的,同时,它们被统称为成员访问限定符。
访问修饰符 | 描述 |
---|---|
public | 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问。 |
protected | 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问。 |
private | 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问 。 |
继承方式 | 描述 |
---|---|
private继承 | 父类的所有方法在子类中变为 private。 |
protected继承 | 父类的 protected 和 public 方法在子类中变为 protected,private 方法不变。 |
public继承 | 父类中的方法属性不发生改变。 |
基类 | 继承方式 | 子类 |
---|---|---|
public | public | public |
public | protected | protected |
public | private | private |
protected | public | protected |
protected | protected | protected |
protected | private | private |
private | public | 子类无权访问 |
private | protected | 子类无权访问 |
private | private | 子类无权访问 |
由上可以看出,public 继承不改变基类成员的访问权限,private 继承使得基类所有成员在子类中的访问权限变为 private,protected 继承将基类中 public 成员变为子类的 protected 成员,其它成员的访问权限不变。基类中的 private 成员不受继承方式的影响,子类永远无权访问。
C++ public protected private可访问性
#include <iostream>
using namespace std;
class Student
{
public:
Student(string name, int age):m_name(name), m_age(age)
{
}
void sayHello()
{
cout << "I am " << m_name << " and i am " << m_age << " years old!" << endl;
}
~Student()
{
cout << "Call ~Student" << endl;
}
protected:
int m_age;
private:
string m_name;
};
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu("HaiCoder", 109);
cout << stu.m_age << endl;
return 0;
}
程序运行后,控制台输出如下:
我们在 main 函数,访问了类的 protected 成员,结果程序报错,因为,类的私有成员不可以在类外面访问,现在,我们修改程序如下:
#include <iostream>
using namespace std;
class Student
{
public:
Student(string name, int age):m_name(name), m_age(age)
{
}
void sayHello()
{
cout << "I am " << m_name << " and i am " << m_age << " years old!" << endl;
}
~Student()
{
cout << "Call ~Student" << endl;
}
public:
int m_age;
private:
string m_name;
};
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu("HaiCoder", 109);
cout << stu.m_age << endl;
return 0;
}
程序运行后,控制台输出如下:
这次,我们将成员变量修改成了 public,此时,在类外部,我们可以访问了。
C++ 中,用来控制访问权限的关键字有 public、protected 和 private,它们分别表示公有的、受保护的和私有的,同时,它们被统称为成员访问限定符。
public 修饰的成员变量和函数可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问,protected 修饰的成员变量和函数可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问。
private 修饰的成员变量和函数只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问。