文章目录
- 参考
 - 描述
 - 结构体
 - 概念
 - 结构体与类
 - 结构体还是类?
 
- 默认访问级别
 - struct 与其默认访问级别
 - class 与其默认访问级别
 
参考
| 项目 | 描述 | 
|---|---|
| 搜索引擎 | Bing、Google | 
| AI 大模型 | 文心一言、通义千问、讯飞星火认知大模型、ChatGPT | 
| C++ Primer Plus (第六版)中文版 | 史蒂芬·普拉达 / 张海龙,袁国忠 译 | 
| 精通C++(第九版) | ISBN:9787302503163 | 
| 黑马程序员 | C++ | 
| CPlusPlus | Reference | 
描述
| 项目 | 描述 | 
|---|---|
| 操作系统 | Windows 10 专业版 | 
| 编辑器 | VSCode | 
| 编译器 | g++.exe (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 13.1.0 | 
结构体
概念
在C++中,结构体主要用于 将分属数种数据类型的数个变量组合成一个单独的数据类型,这使得我们可以更容易地组织和处理相关的数据。结构体的定义通常包括关键字 struct、结构体名称 以及 包含在花括号中的成员。
一个普通的结构体定义
struct MyStruct
{
    string name = "RedHeart";
    unsigned short age = 18;
    string nation = "China";
    string home = "BinaryMoon";
};
 
结构体与类
C++ 最初被设计为 C with classes,它是C语言的一个超集。由于C语言已支持结构体,C++便继承了这一特性。
 为了确保与 C 的 兼容性,C++ 保持了 struct 的 语法和语义。但为了 利用面向对象的特性,C++ 扩展了 struct,使其与 C++ 中的类 近乎一模一样。

尽管 struct 和 class 在语法上 几乎相同,但程序员通常会按照一致的约定来使用它们,例如 使用 struct 来表示纯粹的存储结构(用于存放多种不同数据类型数据的结构),而 使用 class 来表示具有行为和属性的类。这种约定有助于代码的 可读性 和 维护性。
结构体还是类?
从语义层面出发,应该 使用 struct 来存放数据,使用 class 来定义类。但 C++ 为开发者提供了足够的灵活性,在特殊情况下我们可以依据特定的情况进行分析。

比如:
| 场景 | 描述 | 
|---|---|
| 与 C 语言交互 | 如果你的 C++ 代码 需要与 C 进行交互,使用结构体可能会更方便一些。因为 C 语言中 没有类的概念,但是 结构体在 C 与 C++ 中都是存在的。 | 
| 性能敏感 | 尽管 在大多数情况下,结构体和类之间的性能差异可以忽略不计,但在一些性能敏感非常严重的场景下,程序员可能更愿意选择 更为简单和直接的数据结构 struct,以确保编译器不会产生较多的额外开销。 | 
默认访问级别
在 C++ 中,类与结构体在功能方面两者之间 存在的最大差异是两者所支持的默认访问级别。
| 修饰符  (Modifier)  | 访问级别  (Access Level)  | 类内部  (Inside Class)  | 子类  (In Subclass)  | 外部  (Outside Class)  | 
|---|---|---|---|---|
public | 公有 | 可访问 | 可访问 | 可访问 | 
protected | 受保护 | 可访问 | 可访问 | 不可访问 | 
private | 私有 | 可访问 | 不可访问 | 不可访问 | 
struct 与其默认访问级别
对于 struct,默认的访问级别是 public。这意味着结构体的成员变量与成员函数默认属于 公共成员,可以从当前结构体的外部对其成员进行直接访问。对此,请参考如下示例:
#include <iostream>
#include <string>
using namespace std;
int main () {
    struct MyStruct
    {
        string name = "RedHeart";
        int age = 18;
        string nation = "China";
        int sayHello() {
            cout << "Hello World" << endl;
            return 0;
        }
    };
    // 通过结构体创建结构体实例
    struct MyStruct myStruct;
    // 访问结构体中的成员并将其内容输出至终端
    cout << myStruct.name << endl;
    cout << myStruct.age << endl;
    cout << myStruct.nation << endl;
    myStruct.sayHello();
    // 通过执行 Windows 平台支持的命令 pause
    // 暂停程序的继续执行,使得我们能够观察到程序的输出结果。
    system("pause");
    return 0;
}
 
执行效果
在上述实例中,我们在创建结构体 MyStruct 的过程中并没有通过使用访问修饰符来设置成员的访问级别,但却能够在定义成员的结构外对其成员进行访问,故结构体默认支持的访问级别是 public。
RedHeart
18
China
Hello World
请按任意键继续. . .
 
class 与其默认访问级别
对于 class,默认的访问级别是 private。这意味着类的成员变量与成员函数默认属于 私有成员,仅能够在当前结构体内部对其成员进行访问。对此,请参考如下示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
    class BaseClass
    {
        string role = "BaseClass";
    };
    // DerivedClass 继承自 BaseClass
    // BaseClass 的成员对 DerivedClass 的访问级别是 public
    class DerivedClass : public BaseClass
    {
        // 尝试通过子类访问父类中的内容
        string snitch() {
            return role;
        }
    };
    system("pause");
    return 0;
}
 
执行效果
C++ 抛出异常信息 'std::string main()::BaseClass::role' is private within this context。由该错误信息我们即可断定类的默认访问级别是 private。



















