前言
在C++中,类是一种用户定义的类型,它允许我们将数据和操作这些数据的函数封装在一起。为了确保这种封装的有效性和数据的安全性,C++提供了三种访问修饰符:public、protected和private。这些修饰符定义了类成员的访问权限,即哪些成员可以被类的外部、类的内部或派生类访问。本文将详细探讨这三种访问修饰符的作用、原理、区别,并通过示例进行说明。
详解
修饰符
public
作用:public修饰的成员可以被类的任何实例、派生类以及类外部的任何代码访问。这些成员构成了类的接口,是类与外部世界交互的桥梁。
示例:通常,类的构造函数、析构函数以及用于设置和获取私有成员状态的公有成员函数都会被声明为public。
protected
作用:protected修饰的成员只能被类本身以及该类的派生类访问,但不能被类的外部代码访问。这提供了一种机制,允许派生类访问和修改基类的某些内部状态,同时保持这些状态对外部世界的隐藏。
示例:在基类中定义的protected成员变量或函数,在派生类中可以直接访问,但在类外部则不可见。
private
作用:private修饰的成员只能被类本身(即类的成员函数、构造函数、析构函数等)访问,不能被类的外部代码或派生类直接访问。这是实现封装和数据隐藏的关键。
示例:类的内部状态(如成员变量)通常会被声明为private,以防止外部代码直接访问和修改这些状态,从而保护类的完整性和数据的安全性。
函数原理
在C++中,成员函数(包括构造函数、析构函数和成员函数)的访问权限也是通过public、protected和private来控制的。这些函数的访问权限决定了它们可以在哪里被调用。例如,一个public成员函数可以被类的任何实例或外部代码调用,而一个private成员函数则只能被类内部的其他成员函数或构造函数/析构函数调用。
区别
访问范围:public成员的访问范围最广,几乎不受限制;protected成员的访问范围次之,仅限于类本身和派生类;private成员的访问范围最窄,仅限于类本身。
设计目的:public成员主要用于定义类的接口;protected成员用于在基类和派生类之间共享数据和方法,同时保持对外部世界的隐藏;private成员则用于封装类的内部实现细节。
示例
#include <iomanip>
#include <iostream>
class Base {
protected:
int protectedVar;
private:
int privateVar;
public:
Base(int pVar, int pvVar) : protectedVar(pVar), privateVar(pvVar) {}
void setProtected(int val) { protectedVar = val; }
void displayProtected() const { std::cout << "Protected Var: " << protectedVar << std::endl; }
// 注意:没有提供直接访问privateVar的公有成员函数
};
class Derived : public Base {
public:
Derived(int pVar, int pvVar) : Base(pVar, pvVar) {} // 定义构造函数并调用Base的构造函数
void displayPrivate() const { // 注意:这是非法的,因为privateVar在Derived中不可见
// std::cout << "Private Var: " << privateVar << std::endl; // 编译错误
}
void displayProtectedAgain() const {
std::cout << "Protected Var (from Derived): " << protectedVar << std::endl;
}
};
int main() {
Base base(10, 20);
base.displayProtected(); // 正确:公有成员函数可以访问
// base.protectedVar = 30; // 编译错误:protectedVar在Base外部不可见
// base.privateVar = 40; // 编译错误:privateVar在Base外部不可见
Derived derived(5, 15);
derived.displayProtectedAgain(); // 正确:派生类可以访问基类的protected成员
// derived.displayPrivate(); // 如果尝试编译,将导致编译错误,因为displayPrivate的尝试是非法的
return 0;
}
小结
public、protected和private访问修饰符是C++类设计中不可或缺的一部分。它们通过控制类成员的访问权限,实现了封装和数据隐藏,从而保护了类的内部实现细节,提高了代码的安全性和可维护性。理解并正确使用这些访问修饰符,是编写高质量C++代码的关键。
笔者主要从事计算机视觉方面研究和开发,包括实例分割、目标检测、追踪等方向,进行算法优化和嵌入式平台开发部署。欢迎大家沟通交流、互帮互助、共同进步。