【C++】类中public、protected和private访问修饰符详解和示例

前言

在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++代码的关键。


笔者主要从事计算机视觉方面研究和开发,包括实例分割、目标检测、追踪等方向,进行算法优化和嵌入式平台开发部署。欢迎大家沟通交流、互帮互助、共同进步。
  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值