C++ struct和class区别 C++结构体与类默认权限对比【概念】

11次阅读

Struct默认访问权限为publicclass默认为private,这是二者最核心区别;其他方面如继承默认权限等也由此衍生。

C++ struct和class区别 C++结构体与类默认权限对比【概念】

struct 和 class 的默认访问权限不同

这是最核心、最实际的区别:在 c++ 中,struct 默认成员(包括成员变量成员函数)是 public,而 默认是 private

这意味着,不写访问说明符时:

  • struct S { int x; void f(); };xf() 都可直接访问
  • class C { int x; void f(); };xf() 默认不可从外部访问

其他所有访问控制行为(如 protected、继承时的权限变化)完全一致,仅默认值不同。

struct 和 class 在继承时的默认访问级别也不同

当不显式指定继承方式时,struct 默认是 public 继承,class 默认是 private 继承。

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

例如:

struct D1 : B { };   // 等价于 struct D1 : public B { }
class D2 : B { };    // 等价于 class D2 : private B { }

这个差异常被忽略,尤其在写模板或泛型基类时,可能导致意外的访问限制或编译错误。

语义习惯与实际使用并无强制约束

C++ 标准并未规定 struct 只能用于纯数据,class 才能封装逻辑——两者语法能力完全等价。

但实践中:

  • struct 通常暗示“轻量、公开、数据导向”,比如 PointConfig、POD 类型
  • class 更倾向表达“封装、接口抽象、有不变量约束”的类型
  • 混用不会报错,但可能让协作者困惑,比如在 struct 里加私有成员+复杂构造函数,就违背直觉

编译器不检查语义,只看语法;但人会。

模板参数和特化中 struct/class 可互换

在模板声明、特化、别名中,structclass 关键字可自由替换,不影响匹配:

template struct Wrapper { T val; };

template class Wrapper { T val; };

这种写法是非法的——注意:struct 不能用作模板参数关键字,只有 classtypename 合法。但反过来,声明一个类模板时用 class,特化时用 struct 完全没问题,因为特化的是类型名,不是关键字本身。

真正容易出错的是跨头文件时,有人用 struct 声明,有人用 class 定义同一类型,导致 ODR 违反(尤其在未启用 -Wodr 时静默失败)。

text=ZqhQzanResources