在堆栈上声明对象的两种方式之间的区别

Ori*_*ski 2 c++ class object copy-constructor assignment-operator

假设我没有operator=在类中指定复制构造函数,以下两个声明之间有什么区别Beatle

Beatle john(paul);

Beatle john = paul;

编辑:

在对象赋值中,=除非另有说明,否则运算符会隐式调用复制构造函数?

Ker*_* SB 7

他们是不同的语法结构.第一个是直接初始化,第二个是复制初始化.它们的行为几乎相同,只是第二个需要非explicit构造函数.*

两者都与赋值运算符无关,因为两行都是初始化.

也就是说:const int i = 4;很好,但const int i; i = 4;不是.

*)更准确:如果声明了相关的构造函数,则第二个版本不起作用explicit.因此,更一般地说,直接初始化为您提供了一个"免费"转换:

struct Foo { Foo(std::string) {} };

Foo x("abc");  // OK: char(&)[4] -> const char * -> std::string -> Foo
Foo y = "abd"; // Error: no one-step implicit conversion of UDTs
Run Code Online (Sandbox Code Playgroud)

解决编辑问题:要了解赋值运算符,只需将其分解为多个部分即可.假设Foo有明显的operator=(const Foo & rhs).我们可以说x = y;,这只是直接与电话运营商rhsy.现在考虑一下:

x = "abc";              // error, no one-step implicit conversion
x = std::string("abc"); // fine, uses Foo(std::string), then copy
x = Foo("abc");         // fine, implicit char(&)[4] -> const char* -> std::string, then as above
Run Code Online (Sandbox Code Playgroud)