C++类基本结构为class关键字+类名+花括号,空类合法且sizeof通常为1;类名首字母大写是约定;类体默认private,需public:声明公有成员;构造函数名须与类名一致且无返回类型;struct与class仅默认访问级别不同。

类的基本结构:用 class 关键字 + 花括号
定义一个最简类,只需要 class 关键字、类名和一对空花括号。C++ 不要求类里必须有成员,空类是合法的,编译能过,sizeof 通常为 1(避免对象地址重叠)。
实操建议:
- 类名首字母大写是常见约定(如
Person),不是语法强制 - 类定义末尾的分号
;不能省——漏掉会报类似expected ';' before '}' token的错误 - 类体内部默认是
private:,不写访问说明符时所有成员都不可外部访问
加一个公有成员变量:用 public: 切换访问级别
想让外部代码能读写某个变量,得显式声明为 public。否则即使定义了变量,也会被挡在类外。
示例:
立即学习“C++免费学习笔记(深入)”;
class Counter {
public:
int value;
};
常见错误现象:
- 忘记写
public:,结果Counter c; c.value = 5;编译失败,报错'int Counter::value' is private - 把
public:写成public()或public void——这是函数声明语法,编译器直接拒识
加一个无参构造函数:显式定义比依赖编译器更可控
空类自带默认构造函数,但一旦你加了任何构造函数(哪怕没参数),编译器就不再自动生成默认版本。所以如果后续需要 Counter c; 这种写法,就得自己写个无参构造。
实操建议:
- 构造函数名必须和类名完全一致,且不能有返回类型(连
void都不能写) - 初始化列表比在函数体内赋值更高效,尤其对非 POD 类型(如
std::string) - 如果只打算支持
Counter c{42};这种列表初始化,可以加explicit防隐式转换
示例(带初始化):
class Counter {
public:
int value;
Counter() : value(0) {} // 初始化列表方式
};
为什么不用 struct?二者在定义简单类时几乎等价
C++ 中 struct 和 class 唯一实质区别是默认访问级别:struct 默认 public,class 默认 private。其余语法、功能、内存布局完全一致。
所以如果你只写一个带 public 成员的简单类,下面两种写法效果一样:
class Counter { public: int value; };
struct Counter { int value; };
容易被忽略的地方:
- 别因为“习惯用
struct表示纯数据”就硬套——C++ 没这限制,class同样可只存数据 - 混合使用时注意:一个类里混用
public:/private:/protected:是允许的,但每次切换都要重新写标签
真正影响选择的,往往是团队规范或语义暗示,而不是技术能力边界。


















