讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋伟君_5077

秋伟君_5077

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

|

811人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

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

在C++中,类和结构体都可以用作基类进行继承。关键区别在于默认继承方式。类默认是私有继承(private inheritance),而结构体默认是公有继承(public inheritance)。这意味着,如果使用class Derived : Base,Base的公有成员在Derived中会变成私有成员。而使用struct Derived : Base,Base的公有成员在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仍然是公有成员,可以在外部直接访问。

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

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

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

考虑以下代码:

#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;
}

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

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

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

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

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

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

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

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

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

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

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

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

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

355

2025.11.27

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

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

4874

2025.06.09

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

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

5031

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

treenode的用法
treenode的用法

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

2621

2023.12.01

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

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

356

2025.12.22

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

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

397

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

472

2026.05.09

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastAPI官方教程文档
FastAPI官方教程文档

共0课时 | 0人学习

Genspark AI使用手册
Genspark AI使用手册

共0课时 | 0人学习

学习Agent,从Dify开始
学习Agent,从Dify开始

共0课时 | 152人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn