初始化对象的方法有很多种,其中一种是调用 centa 用户定义类型的构造函数。以下是示例。
Hello my_hello = Hello(3);
Hello my_hello(3);
如您所知,构造函数不返回任何内容。但是,正如您在上面看到的,它似乎确实返回了它的初始化对象。此外,赋值运算符使其更加可疑,因为这意味着它将右侧对象复制到左侧对象。
我猜错了吗?你能解释一下吗?
初始化对象的方法有很多种,其中一种是调用 centa 用户定义类型的构造函数。以下是示例。
Hello my_hello = Hello(3);
Hello my_hello(3);
如您所知,构造函数不返回任何内容。但是,正如您在上面看到的,它似乎确实返回了它的初始化对象。此外,赋值运算符使其更加可疑,因为这意味着它将右侧对象复制到左侧对象。
我猜错了吗?你能解释一下吗?
宣言
Hello my_hello = Hello(3);
创建两个对象。首先是一个临时对象Hello(3)
,然后这个临时对象通过复制构造函数复制到,my_hello
然后是临时对象的销毁。
然而,为了进一步混淆水,这种临时对象的复制和破坏实际上可能由于复制省略(一种非常常见的编译器优化)而不会发生。
如您所知,构造函数不返回任何内容。
根据标准,这是绝对正确的。
但是,将 T 的构造函数视为返回 T 的函数(或将其替换为 a'lanew
和Placement new
)要简单得多。这基本上就是它们的使用和实现方式。
此外,您的代码中没有赋值运算符。那是复制初始化,这不是一回事。该my_hello
对象是从 复制的Hello(3)
。
只有一种方法可以找出...尝试一些代码:
#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