1

初始化对象的方法有很多种,其中一种是调用 centa 用户定义类型的构造函数。以下是示例。

Hello my_hello = Hello(3);
Hello my_hello(3);

如您所知,构造函数不返回任何内容。但是,正如您在上面看到的,它似乎确实返回了它的初始化对象。此外,赋值运算符使其更加可疑,因为这意味着它将右侧对象复制到左侧对象。

我猜错了吗?你能解释一下吗?

4

3 回答 3

3

宣言

Hello my_hello = Hello(3);

创建两个对象。首先是一个临时对象Hello(3),然后这个临时对象通过复制构造函数复制到,my_hello然后是临时对象的销毁。

然而,为了进一步混淆水,这种临时对象的复制和破坏实际上可能由于复制省略(一种非常常见的编译器优化)而不会发生。

于 2013-08-10T11:59:27.367 回答
1

如您所知,构造函数不返回任何内容。

根据标准,这是绝对正确的。

但是,将 T 的构造函数视为返回 T 的函数(或将其替换为 a'lanew和Placement new)要简单得多。这基本上就是它们的使用和实现方式。

此外,您的代码中没有赋值运算符。那是复制初始化,这不是一回事。该my_hello对象是从 复制的Hello(3)

于 2013-08-10T12:00:03.520 回答
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

即没有调用赋值运算符。应该真正添加一个复制构造函数并检查它是否被使用......将其视为读者的练习。

http://ideone.com/9Yr2WY

编辑:出于好奇,这是一个包含复制构造函数的版本。在这种情况下,这两行都没有调用复制构造函数——正如 Joachim 指出的那样,编译器已经成功地优化了副本:http: //ideone.com/wQ1VTK

于 2013-08-10T12:08:03.660 回答