首页 > 后端开发 > C++ > 正文

C++中类与结构体有什么区别 深入探讨访问控制与内存布局差异

P粉602998670
发布: 2025-07-21 12:29:01
原创
784人浏览过

c++++中,类和结构体的主要区别在于默认访问权限和继承方式:1. 类默认是private访问权限,结构体默认是public;2. 类默认私有继承,结构体默认公有继承。更深层次上,类强调封装和隐藏实现细节,适合复杂对象的设计;结构体侧重暴露数据,适合简单数据结构的表示。两者在内存布局上无本质差异,但在涉及虚函数或多态时会引入虚函数表指针,影响对象大小。选择使用类还是结构体取决于设计意图、代码可读性和维护性等因素。

C++中类与结构体有什么区别 深入探讨访问控制与内存布局差异

C++中,类和结构体的主要区别在于默认访问权限:类默认是private,结构体默认是public。当然,这只是表象,更深层次的差异体现在设计意图和使用场景上。

C++中类与结构体有什么区别 深入探讨访问控制与内存布局差异

访问控制与内存布局差异详解

C++中类与结构体有什么区别 深入探讨访问控制与内存布局差异

在C++中,类和结构体(struct)经常被新手混淆,认为它们只是默认访问权限不同。但实际上,它们之间的差异远不止于此。深入理解这些差异,能帮助我们编写更健壮、更易于维护的代码。

立即学习C++免费学习笔记(深入)”;

结构体和类在继承方式上有什么不同?

在C++中,类和结构体都可以用作基类进行继承。关键区别在于默认继承方式。类默认是私有继承(private inheritance),而结构体默认是公有继承(public inheritance)。这意味着,如果使用class Derived : BaseBase的公有成员在Derived中会变成私有成员。而使用struct Derived : BaseBase的公有成员在Derived中仍然是公有成员。

C++中类与结构体有什么区别 深入探讨访问控制与内存布局差异

举个例子:

#include <iostream>

class BaseClass {
public:
    int publicVar = 10;
};

struct BaseStruct {
public:
    int publicVar = 20;
};

class DerivedClass : BaseClass {
public:
    void print() {
        // 可以访问 publicVar,但只能在 DerivedClass 内部访问
        std::cout << publicVar << std::endl;
    }
};

struct DerivedStruct : BaseStruct {
public:
    void print() {
        std::cout << publicVar << std::endl; // 可以直接访问 publicVar
    }
};

int main() {
    DerivedClass dc;
    dc.print(); // 输出 10
    // std::cout << dc.publicVar << std::endl; // 错误:publicVar 在 DerivedClass 中是私有的

    DerivedStruct ds;
    ds.print(); // 输出 20
    std::cout << ds.publicVar << std::endl; // 正确:publicVar 在 DerivedStruct 中是公有的

    return 0;
}
登录后复制

可以看到,DerivedClass继承BaseClass后,publicVar变成了私有成员,只能在DerivedClass内部访问。而DerivedStruct继承BaseStruct后,publicVar仍然是公有成员,可以在外部直接访问。

这个默认继承方式的差异,实际上反映了类和结构体在设计上的不同侧重点。类更倾向于封装和隐藏实现细节,而结构体更倾向于表示简单的数据结构。

类和结构体在内存布局上有什么区别?

理论上,类和结构体在内存布局上没有本质区别。它们的成员按照声明的顺序依次排列在内存中,受到编译器对齐规则的影响。但是,在某些特殊情况下,比如涉及虚函数或多重继承时,类的内存布局会更加复杂。

有道小P
有道小P

有道小P,新一代AI全科学习助手,在学习中遇到任何问题都可以问我。

有道小P 64
查看详情 有道小P

考虑以下代码:

#include <iostream>

struct SimpleStruct {
    int a;
    char b;
    double c;
};

class SimpleClass {
public:
    int a;
    char b;
    double c;
};

struct VirtualStruct {
    virtual void foo() {}
    int a;
};

class VirtualClass {
public:
    virtual void foo() {}
    int a;
};

int main() {
    std::cout << "sizeof(SimpleStruct): " << sizeof(SimpleStruct) << std::endl; // 输出可能是 16 或 24,取决于编译器对齐规则
    std::cout << "sizeof(SimpleClass): " << sizeof(SimpleClass) << std::endl; // 输出可能是 16 或 24,取决于编译器对齐规则
    std::cout << "sizeof(VirtualStruct): " << sizeof(VirtualStruct) << std::endl; // 输出可能是 8 或 16,取决于编译器和指针大小
    std::cout << "sizeof(VirtualClass): " << sizeof(VirtualClass) << std::endl; // 输出可能是 8 或 16,取决于编译器和指针大小
    return 0;
}
登录后复制

SimpleStructSimpleClass的内存布局基本相同,都受到编译器对齐规则的影响。而VirtualStructVirtualClass由于包含虚函数,会引入虚函数表指针(vptr),导致它们的大小增加。这个vptr通常放在对象的起始位置。

需要注意的是,编译器可能会对结构体或类的成员进行重新排序,以优化内存布局,减少内存碎片。可以使用#pragma pack指令来控制编译器的对齐行为,但这可能会影响程序的性能。

如何选择使用类还是结构体?

选择使用类还是结构体,实际上是一个代码风格和设计决策问题。

  • 结构体: 通常用于表示简单的数据结构,比如表示一个点、一个矩形等。结构体的成员通常是公有的,可以直接访问。结构体倾向于暴露数据,而不是隐藏实现细节。

  • 类: 通常用于表示更复杂的对象,包含数据和行为。类的成员通常是私有的,需要通过公有的方法来访问。类倾向于封装和隐藏实现细节,提供更好的抽象和控制。

一般来说,如果需要封装数据和行为,并提供抽象接口,那么应该选择类。如果只是简单地将数据组织在一起,那么可以选择结构体。

此外,还可以考虑以下因素:

  • 代码可读性: 使用结构体可以更清晰地表达数据结构的意图,而使用类可以更清晰地表达对象的行为和状态。
  • 代码维护性: 类提供的封装和抽象可以更好地应对代码的修改和扩展。
  • 团队规范: 遵循团队的代码规范,保持代码风格的一致性。

实际上,在C++中,类和结构体并没有绝对的界限。它们都可以实现相同的功能,只是在设计意图和使用场景上有所侧重。最终的选择取决于具体的应用场景和个人的编程风格。

以上就是C++中类与结构体有什么区别 深入探讨访问控制与内存布局差异的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号