0

0

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

P粉602998670

P粉602998670

发布时间:2025-07-21 12:29:01

|

791人浏览过

|

来源于php中文网

原创

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 

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仍然是公有成员,可以在外部直接访问。

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

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

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

Text-To-Pokemon口袋妖怪
Text-To-Pokemon口袋妖怪

输入文本生成自己的Pokemon,还有各种选项来定制自己的口袋妖怪

下载

考虑以下代码:

#include 

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

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

533

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

11

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1010

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

57

2025.10.17

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

24

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 1.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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