『深度编码』C++中类的访问权限

在C++中,类是面向对象编程的核心组成部分,它允许开发者创建自定义的数据类型,封装数据和操作。为了保护数据的安全性和实现程序的模块化,C++引入了访问权限控制。

访问权限定义了哪些成员可以被类外部或其他类访问。通过合理设置访问权限,我们可以确保类的内部实现细节不被无意间或恶意篡改。总的来说,访问权限在C++中的作用不仅仅是控制成员的可访问性,更是在实现良好的代码设计、提高程序的安全性、可维护性和可扩展性方面发挥着重要的作用。

一、三种访问权限

类在设计时,可以把不同的属性和行为放在不同的权限下,加以控制。

访问权限分为三种:

public 公共权限

protected 受保护权限

private 私有权限

『深度编码』C++中类的访问权限_第1张图片

二、public 公共权限

1.定义:

public成员在任何作用域下皆可访问,包括类内(类内的成员函数内访问)、子类和对象访问(通过 . 来访问)

我们可以把 public 比作一个商场的大门。想象一下,一个商场的大门是敞开的,任何人都可以自由进出,无需任何限制。就像 public 关键字定义的成员变量或函数,任何外部代码都能直接访问和使用它们,没有任何阻碍。

2.用法示例:

#include 
#include 
using namespace std;

class Student {
public: //  public 区域定义
    string name; // 公开成员变量
    int id; // 公开成员变量
    // 公开成员函数
    void print() 
    {
        cout << "姓名" << name << " " << "学号" << id << endl;
    }
};

int main()
{
    Student stu; 

    // 初始化公开成员变量
    stu.name = "张三";
    stu.id = 10000;

    // 调用公开成员函数
    stu.print();

    return 0;
}

我们定义了一个 Student 类,包含两个公开的成员变量 name 和 id,以及一个公开的成员函数 print()。在 main() 函数中,通过创建 Student 类的对象 stu,并为其成员变量赋值,最后调用 print() 函数来输出学生的姓名和学号。

3.权限表:

访问类型 本类内访问 派生类访问 类外部访问
public 成员 可访问 可访问 可访问

三、protected 受保护权限

1.定义:

被声明为 protected 的成员可以被类内及其派生类(子类)访问,但不能被类外的代码直接访问。

我们可以把 protected 比作家庭院子的大门。 这个大门不像商场的大门那样完全开放,它只允许家庭成员和特别授权的人进入。如果你是家里的人或者是受邀请的客人,你可以自由进出,但外面的人则无法轻易进入。 在编程中,protected 关键字定义的成员变量或函数只有在继承了该类的子类中才能访问,或者是当前类的成员函数才能访问,外部代码无法直接访问。就像家庭院子的门,外人不能随意进入,但家人或受邀的客人(子类)可以进入并使用这些资源。所以,protected 就像是一个只对特定人群开放的大门,虽然不完全开放,但可以通过适当的途径(继承或访问权限)进行访问。

2.用法示例:

#include 
#include 
using namespace std;

class Student 
{
protected:
    string name; // 受保护的成员变量
    int id;      // 受保护的成员变量

public:
    // 公开成员函数
    void print() 
    {
        cout << "姓名" << name << " " << "学号" << id << endl;
    }
};

class PROStudent : public Student 
{  // 派生类
public:
    void A(string n, int i) {
        name = n;  // 访问 protected 成员变量
        id = i;    // 访问 protected 成员变量
    }
};

int main() {
    PROStudent stu;  // 创建PROStudent类型的对象
    stu.A("张三", 0001);// 调用派生类的成员函数初始化数据
    stu.print(); // 调用基类的公开成员函数
    return 0;
}

在这段代码中,name 和 id 成员被标记为 protected,这意味着它们不能直接在 main() 函数中访问,但可以通过继承自 Student 类的子类访问。在派生类 GraduateStudent 中,定义了一个成员函数 setDetails,用来访问和修改 protected 成员变量 name 和 id。通过继承,子类可以访问父类的 protected 成员,而外部代码无法直接访问它们。最后,在 main() 函数中,调用 stu.print() 输出学生信息,展示了继承和访问受保护成员的应用。

3.权限表:

访问类型 本类内访问 派生类访问 类外部访问
protected 成员 可访问 可访问 不可访问

四、private 私有权限

1.定义:

当类中的成员(包括变量和方法)被声明为 private 时,这些成员只能由该类内的函数或其友元函数访问。

我们可以把 private 比作房间的门,而且这扇门是锁着的。 这扇门只有房间的主人才能打开和进入,外面的人无法随便进入。即使外面的人知道房间里有什么,他们也无法直接接触里面的东西,除非主人主动让他们进来或者通过特殊方式才能进入。 在编程中,private 关键字定义的成员变量或函数只能在该类内部访问,外部代码无法直接访问。就像房间的门只有房主才能打开,外部无法接触到里面的内容一样,private 成员是对外界隐藏的,只有类内部的成员函数或方法才能与之互动。

2.用法示例:

#include 
#include 
using namespace std;

class Student 
{
private:  //  private 区域定义
    string name;  // 私有成员变量
    int id;       // 私有成员变量

public:
    void STU(string n, int i)
    {
        name = n;  // 通过成员函数访问私有成员变量
        id = i;    // 通过成员函数访问私有成员变量
    }
    void print() 
    {
        cout << "姓名: " << name << " " << "学号: " << id << endl;
    }
};

int main() 
{
    Student stu;  // 创建 Student 类型的对象
    stu.STU("张三", 0001);// 通过公共成员函数初始化私有成员变量
    stu.print();// 调用公共成员函数输出学生信息
    return 0;
}

我们定义了一个 Student 类,其中包含两个私有成员变量 name 和 id。通过 private 访问控制,外部代码无法直接访问这两个成员变量。类中提供了两个公共成员函数:STU 用于设置学生的姓名和学号,它接收两个参数并将它们赋值给 name 和 id;print 函数用于输出学生的信息。在 main() 函数中,创建了一个 Student 类的对象 stu,然后通过 STU 函数为其设置姓名和学号,最后通过 print 函数输出学生的信息。这种做法使用了封装原则,通过公共函数控制私有成员的访问。

3.权限表

访问类型 本类内访问 派生类访问 类外部访问
private 成员 可访问 不可访问 不可访问

五、公有、私有、受保护权限对比

特性 public protected private
类内部访问 允许访问  允许访问  允许访问
友元函数/类访问 允许访问  允许访问  允许访问
类外部(对象)访问 允许访问  禁止访问  禁止访问
继承中的可见性 可被派生类访问 可被派生类访问  禁止派生类访问
public继承后权限 保持public 保持protected 不可访问
protected继承后权限 变为protected 保持protected 不可访问
private继承后权限 变为private 变为private 不可访问
默认访问权限 struct成员默认 无默认 class成员默认
主要设计目的 定义公共接口 实现继承体系下的受限共享 隐藏实现细节

六、类默认访问权限

class:成员默认private。

struct:成员默认public。

你可能感兴趣的:(『深度编码』C++中类的访问权限)