struct实现真正封装的唯一方式是显式添加private:,否则默认所有成员为public;它与class在封装能力上完全等价,仅默认访问权限和继承方式不同。

可以,但必须显式写 private:,不能依赖默认行为。
struct 默认所有成员都是 public
这是最常被忽略的前提。C++ 标准规定:struct 的默认访问权限是 public,哪怕你加了成员函数、用了构造函数、甚至继承了其他类型,只要没写 private: 或 protected:,所有成员就自动对外可见。
常见错误现象:
- 把 struct 当成轻量 class 直接用,结果 data 成员被外部随意修改;
- 以为加了 set_value() 函数就算封装了,却忘了把 value 本身设为私有。
示例:
struct BadEncap {
int value; // ← 这里是 public!即使下面写了 setter
void set_value(int v) { value = v; }
};
BadEncap b;
b.value = 42; // 合法,封装失效
让 struct 实现真正封装的唯一方式是手动加 private
只要你愿意,struct 完全可以和 class 一样严格控制访问——只是多敲几下键盘而已。
实操建议:
- 在需要封装的位置上方明确写
private:(不能省略冒号) - 可以把
public:和private:混用多次,按逻辑分组 - 构造函数、运算符重载、
friend声明等高级特性,struct全都支持
示例:
struct Point {
private:
double x_, y_;
public:
Point(double x, double y) : x_(x), y_(y) {}
double distance_to_origin() const { return std::sqrt(x_*x_ + y_*y_); }
// x_, y_ 无法从外部直接访问
};
class 和 struct 在封装能力上完全等价
它们之间没有功能高下之分,只有默认权限和默认继承方式不同。一旦你显式写出访问标号,二者生成的二进制、ABI、可内联性、模板匹配行为全部一致。
关键差异点:
-
class Base {};→class Derived : Base {};默认是private继承 -
struct Base {};→struct Derived : Base {};默认是public继承 - 但只要写明
: public Base或: private Base,这个区别就消失了
所以要不要用 struct 封装,只取决于团队约定或语义习惯:比如你希望它“看起来像数据载体”,又确实需要控制访问,那就老老实实加 private:。
最容易被忽略的一点:很多人改 struct 为封装时只改了成员变量,却忘了把原本公开的构造函数也挪到 public: 区域——否则连对象都实例化不了。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











