侧边栏壁纸
博主头像
LittleAO的学习小站 博主等级

在知识的沙漠寻找绿洲

  • 累计撰写 125 篇文章
  • 累计创建 27 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

C++的访问控制与封装

LittleAO
2023-11-30 / 0 评论 / 0 点赞 / 30 阅读 / 0 字
温馨提示:
本文最后更新于2023-11-30,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

C++的访问控制(封装)

访问说明符

在之前的我们介绍了如何定义一个简单的类,那时候使用的是struct关键字。在C++中,还可以使用访问说明符来控制成员的可访问性。如果想要控制成员的可访问性,需要在定义类时使用class关键字。访问说明符有以下几种:

  1. public:公有成员可以被任何人访问,无论是类的对象还是类的成员函数。

  2. private:私有成员只能被类的成员函数和其友元函数访问。这是class类成员的默认访问级别。

  3. protected:受保护成员可以被类的成员函数、派生类的成员函数以及友元函数访问,但不能被类对象直接访问。

使用classstruct定义类的唯一区别是默认的访问权限。

class默认的访问权限为private,而struct默认的访问权限为public

下面是一个简单的例子,展示了如何在类中使用这些访问控制符:

class MyClass {
public:
    int publicVar; // 公有成员变量

    MyClass() : publicVar(0), privateVar(0), protectedVar(0) {}

    void publicFunction() {
        // 可以访问public, private, 和 protected成员
    }

private:
    int privateVar; // 私有成员变量

    void privateFunction() {
        // 可以访问public, private, 和 protected成员
    }

protected:
    int protectedVar; // 受保护成员变量

    void protectedFunction() {
        // 可以访问public, private, 和 protected成员
    }
};

class Derived : public MyClass {
    // Derived类可以访问MyClass的public和protected成员,但不能直接访问private成员
};

int main() {
    MyClass obj;
    obj.publicVar = 1; // 正确:public成员可以在类外部访问
    // obj.privateVar = 2; // 错误:private成员不能在类外部访问
    // obj.protectedVar = 3; // 错误:protected成员不能在类外部通过类的对象访问

    return 0;
}

在这个例子中,publicFunctionprivateFunctionprotectedFunction都可以在类内部访问所有类型的成员变量,但是从类外部只能访问public成员。派生类可以访问publicprotected成员,但不能访问private成员。

友元

当我们把类的成员声明为private,在类外就不能调用类的成员了,那么有没有一种方法能够调用class声明的类?其中一种方法就是将我们想要类访问的接口声明为public,而另一种方法就是将其他类或者想要调用的函数声明为友元

下面是一个使用友元函数的例子:

#include <iostream>

class Box {
// 声明一个友元函数
friend void printWidth(Box box);
private:
    double width;

public:
    Box() : width(0) {}

    void setWidth(double wid) {
        width = wid;
    }
};

// 定义一个友元函数
void printWidth(Box box) {
    // printWidth()是Box的友元,它可以直接访问Box的任何成员
    std::cout << "Width of box: " << box.width << std::endl;
}

int main() {
    Box box;

    // 使用成员函数设置宽度
    box.setWidth(10.0);

    // 使用友元函数输出宽度
    printWidth(box);

    return 0;
}

一般来说,在类定义开始或结束前的位置集中声明友元。

在类中的友元定义仅仅制定了访问权限,并非函数声明。这意味着我们必须在类外重新声明并定义这个类。尽管有些编译器可以仅声明友元,但最好还是提供一个独立的函数声明。

0

评论区