一目了然,构造函数返回一个对象

时间:2013-08-10 11:53:44

标签: c++

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

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

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

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

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

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

http://ideone.com/9Yr2WY

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