在C++中,public
、private
和 protected
是用于控制类成员(变量和函数)访问权限的关键字。它们决定了类成员在代码中的可见性和可访问性。在学习时候,对于public是最容易理解的,对于private也好理解,但是对于protected总是会有混淆,整理如下;
以下是它们的详细规则和应用场景:
1. public
(公有成员)
-
规则:
-
公有成员可以在任何地方被访问,包括:
-
类内部。
-
类外部的代码(通过对象或指针)。
-
派生类(子类)。
-
-
-
示例:
class MyClass {
public:
int publicVar; // 公有变量
void publicMethod() {
// 可以在任何地方调用
}
};
int main() {
MyClass obj;
obj.publicVar = 10; // 合法:外部直接访问
obj.publicMethod(); // 合法:外部调用
return 0;
}
2. private
(私有成员)
-
规则:
-
私有成员只能在类的内部或类的**友元(
friend
)**中访问。 -
派生类无法直接访问基类的私有成员。
-
-
设计意义:
-
封装类的内部实现细节,防止外部直接修改关键数据。
-
例如:类的内部状态、辅助工具函数等。
-
-
示例:
class MyClass {
private:
int privateVar; // 私有变量
void privateMethod() {
// 只能在类内部或友元中调用
}
public:
void setVar(int value) {
privateVar = value; // 合法:类内部访问私有成员
}
};
int main() {
MyClass obj;
// obj.privateVar = 10; // 非法:外部无法访问私有成员
// obj.privateMethod(); // 非法:外部无法调用私有方法
obj.setVar(10); // 合法:通过公有方法间接修改私有变量
return 0;
}
//下面考虑private修饰符,在子类的进一步示例
class MyClassChild public MyClass {
public:
void childSetVar(int value) {
// privateVar = value; // 非法,在子类中即便通过子类的自定义函数也无法访问
setVar(value); // 合法,通过父类的方法可以访问private
}
};
3. protected
(保护成员)
-
规则:
-
保护成员可以在类的内部、友元以及派生类中访问。
-
类外部的代码(非友元)无法直接访问。
-
-
设计意义:
-
允许派生类扩展基类的功能,同时保持对外的封装性。
-
例如:基类中需要被子类重写的方法或需要被子类直接访问的数据。
-
-
示例:
class Base {
protected:
int protectedVar; // 保护变量
};
class Derived : public Base {
public:
void modifyVar() {
protectedVar = 20; // 合法:派生类内部访问基类的保护成员
}
};
int main() {
Derived obj;
// obj.protectedVar = 10; // 非法:外部无法直接访问保护成员
obj.modifyVar(); // 合法:通过派生类的公有方法间接修改
return 0;
}
4. 总结(不考虑友元场景)
-
public
:开放接口,供所有代码使用。 -
private
:完全封装,仅限制在声明变量的类内成员函数可以访问。 -
protected
:半开放接口,对于子类成员函数开放;子类和基类的成员函数都可以访问 -
继承方式决定了基类成员在派生类中的“可见性上限”。
-
如果在BASE类中定义了一个变量; 再定义一个子类,子类中对于该变量访问规则如下
基类 | 子类 | |
public | 任何支持的语法进行访问 | 任何支持的语法进行访问 |
private | 只有基类成员函数可以访问 | 不可见,只能通过父类成员函数访问 |
protected | 只有基类成员函数可以访问 | 可见,可以在子类的成员函数中进行访问; |