将 C++ 中的这两种初始化方法比较一个平凡的复数类。
complx one(1,3);
complx two = complx(3,4);
在第二种情况下,我会得到一个构造函数,然后是赋值,然后是拷贝,还是只是构造函数?
是否可以区分这两种类型的初始化?
最佳答案
complx two = complx(3,4);
这是一个复制初始化。此规则涵盖了此初始化程序的特定语义:
也就是说,源类型与目标类型相同的复制初始化的行为类似于直接初始化。所以这使得声明等效于:
complx two(complx(3,4));
这会构造一个临时的
complx
对象,然后使用复制/移动构造函数来构造 two
。但是,可以省略此复制/移动:
但是,复制构造函数必须仍然可以访问,就像它被调用一样。
可以区分这两种初始化吗?假设复制/移动有效,不可靠,不。如果编译器确实在复制初始化中省略了拷贝,或者如果拷贝行为良好并且没有任何额外的副作用,那么两者的行为将完全相同。如果它没有省略拷贝并且拷贝有一些额外的副作用,那么您会注意到差异。
关于c++ - 我会通过此初始化获得拷贝或分配吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15412762/