有很多方法可以初始化一个对象,其中一种方法是调用centain用户定义类型的构造函数。以下是示例。
Hello my_hello = Hello(3);
Hello my_hello(3);
如您所知,构造函数不返回任何内容。但是,如上所示,它似乎确实返回了它的初始化对象。此外,赋值运算符使其更具可疑性,因为它意味着它将右手对象复制到左手对象。
我猜错了吗?你能解释一下吗?
答案 0 :(得分:3)
声明
Hello my_hello = Hello(3);
创建两个对象。首先是来自Hello(3)
的临时对象,然后通过复制构造函数将此临时对象复制到my_hello
,然后销毁临时对象。
然而,为了进一步混淆水,临时对象的复制和销毁实际上可能不会由于copy elision而发生,这是一种非常常见的编译器优化。
答案 1 :(得分:1)
正如您所知,构造函数不会返回任何内容。
根据标准,这是严格的。
然而,考虑T的构造函数作为返回T(或放置它,a'la new
和placement new
)的函数是一件非常简单的事情。这基本上就是它们的使用和实施方式。
此外,您的代码中没有赋值运算符。那就是复制初始化,这不是一回事。 my_hello
对象是从Hello(3)
复制的。
答案 2 :(得分:1)
只有一种方法可以找到...尝试一些代码:
#include <iostream>
#include <cstdio>
using namespace std;
class Hello{
public:
Hello(int n)
{
printf("CTOR\n");
}
Hello& operator=(Hello& h)
{
printf("assignment\n");
return *this;
}
};
int main() {
printf("first:\n");
Hello firstHello(3);
printf("\nsecond:\n");
Hello secondHello = Hello(4);
return 0;
}
结果:
first:
CTOR
second:
CTOR
即。没有调用赋值运算符。 应该真的添加一个复制构造函数并检查是否使用了...将其视为读者的练习。
编辑:出于好奇,这是一个包含复制构造函数的版本。 在这种情况下,这两行都没有调用复制构造函数 - 正如Joachim指出的那样,编译器已成功优化了复制: http://ideone.com/wQ1VTK