• C++ 与复合数据类型:透过类理解结构体


    参考

    项目描述
    搜索引擎BingGoogle
    AI 大模型文心一言通义千问讯飞星火认知大模型ChatGPT
    C++ Primer Plus (第六版)中文版史蒂芬·普拉达 / 张海龙,袁国忠 译
    精通C++(第九版)ISBN:9787302503163
    黑马程序员C++
    CPlusPlusReference

    描述

    项目描述
    操作系统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";
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结构体与类

    C++ 最初被设计为 C with classes,它是C语言的一个超集。由于C语言已支持结构体,C++便继承了这一特性。
    为了确保与 C 的 兼容性,C++ 保持了 struct 的 语法和语义。但为了 利用面向对象的特性,C++ 扩展了 struct,使其与 C++ 中的类 近乎一模一样

    尽管 structclass 在语法上 几乎相同,但程序员通常会按照一致的约定来使用它们,例如 使用 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 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    执行效果

    在上述实例中,我们在创建结构体 MyStruct 的过程中并没有通过使用访问修饰符来设置成员的访问级别,但却能够在定义成员的结构外对其成员进行访问,故结构体默认支持的访问级别是 public

    RedHeart
    18
    China
    Hello World
    请按任意键继续. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5

    class 与其默认访问级别

    对于 class,默认的访问级别是 private。这意味着类的成员变量与成员函数默认属于 私有成员仅能够在当前结构体内部对其成员进行访问。对此,请参考如下示例:

    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    执行效果

    C++ 抛出异常信息 'std::string main()::BaseClass::role' is private within this context。由该错误信息我们即可断定类的默认访问级别是 private

  • 相关阅读:
    【稳定性】关于缩短MTTR的探索
    [C++]Leetcode17电话号码的字母组合
    [附源码]java毕业设计青少年计算机知识学习系统
    跨语言调用C#代码的新方式-DllExport
    90、网络硬件一文通
    MySQL怎么为表添加描述
    Xgboost系列-XGB实际参数调优指南附源码
    python编程:加速计算机,优化性能的关键一步——清理临时文件夹Temp
    OpenTelemetry agent 对 Spring Boot 应用的影响:一次 SPI 失效的
    QT实战之翻金币游戏【详细过程及介绍】
  • 原文地址:https://blog.csdn.net/qq_44879989/article/details/133753554