0

0

c++结构体struct和类class区别_c++面向对象基础

尼克

尼克

发布时间:2026-01-03 14:34:02

|

327人浏览过

|

来源于php中文网

原创

struct默认public继承和public成员,class默认private继承和private成员;语义上struct多用于纯数据聚合,class用于封装逻辑;模板特化时关键字须与声明一致;聚合初始化取决于类型是否为聚合类,与关键字无关。

c++结构体struct和类class区别_c++面向对象基础

struct 默认是 public 继承和 public 成员

这是最直接、最常被忽略的差异。C++ 中 structclass 语法几乎完全等价,唯一默认行为不同: - struct 的默认继承方式是 public,默认成员访问权限也是 public; - class 的默认继承方式是 private,默认成员访问权限也是 private

也就是说,下面两个定义在行为上完全等价:

struct A {
    int x;
    void f() {}
};
// 等价于
class A {
public:
    int x;
    void f() {}
};

但如果你写:

struct B : A { int y; };        // 默认 public 继承
class C : A { int y; };         // 默认 private 继承 → C 不是 A 的公有子类

这时候 C 无法被当作 A 使用(比如不能传给接受 A& 的函数),而 B 可以——这个区别在模板推导、多态和接口设计中会悄悄出问题。

语义习惯与 ABI 兼容性影响实际使用

虽然语言层面 structclass 可互换,但 C++ 社区有强约定:

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

  • struct 多用于纯数据聚合(POD 或标准布局类型),比如 PointConfig、C 接口封装;
  • class 多用于封装逻辑、隐藏实现、提供不变式(如 std::vectorstd::string)。

这种习惯不是语法强制,但会影响:

  • ABI 兼容性:带虚函数、非 trivial 构造/析构的 class 可能改变内存布局;而纯 struct 更容易与 C 互操作;
  • 编译器优化:某些场景下(如聚合初始化、结构体拷贝),编译器对 struct 更倾向按字节处理;
  • 代码可读性:看到 struct S { int a, b; };,读者默认不期待它有复杂生命周期管理;看到 class FileHandle,立刻警惕资源释放逻辑。

模板参数和特化时 struct/class 不能混用

模板声明里用 class T 还是 typename T 是语法习惯,但显式特化时,structclass 关键字必须和原始声明一致——否则编译器报错:

iHuzu ECWS 狐族企业建站系统1.0 beta3
iHuzu ECWS 狐族企业建站系统1.0 beta3

iHuzuCMS狐族内容管理系统,是国内CMS市场的新秀、也是国内少有的采用微软的ASP.NET 2.0 + SQL2000/2005 技术框架开发的CMS,充分利用ASP.NET架构的优势,突破传统ASP类CMS的局限性,采用更稳定执行速度更高效的面向对象语言C#设计,全新的模板引擎机制, 全新的静态生成方案,这些功能和技术上的革新塑造了一个基础结构稳定功能创新和执行高效的CMS。iHuzu E

下载
template struct Container { /* ... */ };
template<> struct Container { /* OK,匹配原始声明 */ };

template<> class Container { / ERROR:原始声明是 struct,这里写 class 不合法 / };

同样,如果原始声明是 template class X;,特化就必须用 class X,不能写 struct X。这不是风格问题,是语法硬性要求。

聚合初始化只认 struct/class 的“聚合”本质,不认关键字

能否用 {...} 初始化,取决于类型是否为「聚合类」(aggregate),跟写的是 struct 还是 class 无关。只要满足:

  • 无用户声明的构造函数;
  • 无私有/保护的非静态数据成员;
  • 无基类;
  • 无虚函数;
  • 无默认成员初始化器(C++11 起放宽,但带默认初始化器仍可能破坏聚合性);

那它就能聚合初始化。例如:

class Vec3 {
public:
    float x, y, z;
}; // 没有构造函数、全是 public 成员 → 是聚合类 → Vec3 v{1,2,3}; 合法

struct Bad { private: int x; }; // 有 private 成员 → 不是聚合类 → Bad b{1}; 非法

所以别以为写了 struct 就一定支持 {} 初始化——得看实际成员和函数,而不是关键字本身。

真正容易踩坑的地方在于:把 struct 当成“轻量级 class”随意加构造函数、虚函数或私有成员,结果发现它突然不能 POD、不能 memcpy、不能和 C 二进制兼容了。关键字只是起点,决定行为的是你实际写的那些东西。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

313

2023.08.02

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.09.05

java面向对象
java面向对象

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

47

2025.11.27

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

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

15

2025.11.27

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

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

194

2025.06.09

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

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

186

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

313

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

194

2025.12.31

热门下载

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

精品课程

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

共18课时 | 4.2万人学习

Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

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

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