结构体构造函数写法与类相同,函数名须与struct名一致且无返回类型;默认public访问权限,可重载;未定义时编译器生成隐式默认构造函数,但自定义任一构造函数后该隐式函数消失;const/引用成员必须用初始化列表;构造函数内return无效,错误应抛异常。

结构体定义构造函数和类完全一致,只是默认访问权限是 public,不写 public: 也能直接调用。
struct 中构造函数的写法和 class 没区别
你只需要在 struct 内部写一个与结构体同名、无返回值的函数即可。编译器会识别它为构造函数。
- 函数名必须和
struct名字完全一致(大小写敏感) - 不能写
void或任何返回类型,连void都不能加 - 可以重载:写多个同名函数,参数不同即可
- 如果不写任何构造函数,编译器会生成一个隐式的默认构造函数(空实现),但一旦你写了任意一个,这个隐式默认构造函数就不再生成
示例:
struct Point {
int x, y;
Point() : x(0), y(0) {} // 无参构造
Point(int a, int b) : x(a), y(b) {} // 带参构造
};
不加 public: 也能用,但要注意默认权限
struct 成员默认是 public,所以构造函数即使没写 public:,外部也可以正常调用。
- 如果你显式写了
private:或protected:,那对应构造函数就只能在内部或派生类中调用 - 常见错误:把构造函数误写成
private后,Point p;编译失败,报错类似error: 'Point::Point()' is private - 结构体里混用
public:/private:是合法的,但容易让人忽略构造函数的实际可访问性
初始化列表比赋值更安全,尤其对 const 或引用成员
构造函数体内的赋值(如 x = a;)发生在对象内存已分配之后;而初始化列表(: x(a))是在对象构建阶段直接初始化成员,对某些类型是唯一可行方式。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
const成员、引用成员、没有默认构造函数的类类型成员,必须在初始化列表中初始化 - 即使不是必须,也建议统一用初始化列表——避免先调默认构造再赋值的冗余开销
- 初始化顺序只取决于成员在
struct中的声明顺序,和初始化列表里的书写顺序无关
反例(编译失败):
struct Bad {
const int val;
Bad(int v) { val = v; } // error: cannot assign to const member
};
正解:
struct Good {
const int val;
Good(int v) : val(v) {} // OK
};
别在构造函数里 return;对象已经存在了
构造函数不是普通函数,它的作用是“让对象进入可用状态”,不是“决定要不要创建对象”。哪怕你在第一行写 return;,对象空间也早已分配完毕,析构函数仍会被调用。
- 这和
malloc+if失败就return的逻辑完全不同 - 如果初始化中途出错(比如文件打不开、内存不足),应抛异常,而不是靠
return规避构造完成 - 返回
void是语法要求,不是控制流出口
真正需要“条件构造”的场景,通常该用工厂函数或 std::optional 包裹返回值,而不是在构造函数里做流程控制。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










