为何C++结构体无需显式声明拷贝构造函数即可用自身类型初始化?
为什么C++结构体可以省略显式拷贝构造函数实现自身初始化?
编译器自动生成默认拷贝构造函数:当你没有为结构体/类显式声明拷贝构造函数时,C++编译器会自动生成一个默认版本。这个默认拷贝构造函数的核心行为是逐成员拷贝——把源对象的每个非静态成员的值,原样复制到新对象的对应成员中。
适配你的示例场景:你的
Foo结构体成员都是int这类简单的POD(Plain Old Data)类型,编译器生成的默认拷贝构造函数,和你手动编写的Foo(const Foo& f) : Foo(f.x, f.y)效果完全一致,都会把foo1的x和y值完整复制给foo2。显式构造函数不影响默认拷贝生成:你虽然声明了带
int参数的构造函数,但这并不会阻止编译器生成默认拷贝构造函数。只有当你显式声明了移动构造函数、移动赋值运算符,或者把拷贝构造函数标记为delete时,编译器才会停止生成默认版本。补充说明:代码里的
Foo foo2 = Foo(foo1);,理论上是先通过拷贝构造创建临时对象,再用临时对象初始化foo2,但编译器通常会触发拷贝省略优化,直接将foo1的成员拷贝到foo2中。不过无论是否有优化,默认拷贝构造函数都是整个初始化过程的底层支撑。
内容的提问来源于stack exchange,提问作者zahl
相关产品推荐
相关产品推荐

