c++中struct和class有什么区别_c++结构体与类对比【详解】

技术百科 裘德小鎮的故事 发布时间:2026-01-26 浏览:
struct成员默认public,class默认private;struct继承默认public,class默认private;struct倾向POD类型和C兼容,class强调封装与资源管理。

默认访问权限不同:不写 public 就会出问题

这是唯一影响编译行为的语法级区别。struct 成员默认 publicclass 默认 private。你写 struct S { int x; };,外部可以直接用 s.x = 42;;但换成 class C { int x; };,同一行代码直接报错:error: 'int C::x' is private

  • 修复方式很简单:显式加 public:private:,两者立刻行为一致
  • 新手常踩的坑:把 class 当成“必须封装”,结果忘了加 public: 导致接口不可见;或把 struct 当成“不能有函数”,其实它完全可以定义构造函数、operator== 甚至虚函数
  • 真正该警惕的不是能不能,而是“为什么这里用了 struct 却有一堆 private 成员”——这会让协作者困惑设计意图

继承时默认方式不同:影响多态和模板推导

不写继承修饰符时,struct D : B {} 等价于 struct D : public B {};而 class D : B {} 等价于 class D : private B {}。这个差异在接口传递和模板匹配中会悄悄暴露:

  • private 继承会切断基类的公有接口,比如 class D : B {} 后,D 对象无法隐式转为 B&,传给接受 B& 的函数会编译失败
  • 模板特化时关键字必须严格匹配:如果声明是 template struct Container;,特化就必须写 template struct Container {};,写成 template class Container {}; 会报错
  • 实际项目中建议始终显式写出 public/private,避免靠默认值埋雷

语义与 ABI 兼容性:选错关键字可能影响二进制接口

虽然功能完全等价,但社区约定深刻影响实际使用:

  • struct 天然倾向 POD 类型(无虚函数、无用户定义构造/析构),适合跨语言交互(如 C 接口)、内存拷贝(memcpy)、网络协议结构体
  • class
    暗示封装逻辑,比如 std::vector 有私有指针、自定义析构、分配器策略——看到它你就该想到资源管理
  • ABI 层面:带虚表或非 trivial 构造的 class 可能改变对象布局;而纯 struct 更易保证标准布局(standard-layout),这对序列化、reinterpret_cast 很关键

什么时候该用 struct,什么时候该用 class

别纠结“能力边界”,看设计意图:

  • struct:配置项(struct Config { std::string host; int port; };)、几何类型(struct Vec3 { float x,y,z; };)、C 兼容结构(struct sockaddr_in)——强调“它是什么”
  • class:需要控制生命周期(class FileHandle)、校验输入(class Temperature { private: double celsius; public: void set_celsius(double); };)、支持多态(有虚函数)——强调“它能做什么”
  • 最危险的信号:一个 struct 里既有 private: 成员,又有复杂构造函数,却没有注释说明为什么破例——这种模糊会拖慢整个团队的理解成本

真正的复杂点不在语法,而在团队对“struct 意味着简单数据”这一共识的依赖程度。一旦打破,就得靠文档和命名来补救,而人总是倾向于跳过文档。


# ai  # 就会  # 这是  # 这一  # 文档  # 什么时候  # 特化  # public  # Error  # 对象  #   # c++  # String  # int  # double  # void  # class  # 资源管理  # 区别  # 指针  # 构造函数  # 接口  # 报错  # 为什么  # private  # operator  # 封装  # 结构体  # 继承  # Struct  # 多态  # 虚函数  # 该用  # Float  # 不写 


相关栏目: <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 AI推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 SEO优化<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 技术百科<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 谷歌推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 百度推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 网络营销<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 案例网站<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 精选文章<?muma echo $count; ?>

相关推荐

在线咨询

点击这里给我发消息QQ客服

在线咨询

免费通话

24h咨询:4006964355


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部