【问题标题】:Weird constructors behavior奇怪的构造函数行为
【发布时间】:2016-06-18 18:15:33
【问题描述】:
#include <iostream>
using namespace std;

class Foo
{
public:
    Foo()
    {
        cout << 0;
    }
    Foo(Foo &f)
    {
        cout << 1;
    }
};

void someFunction(Foo f) {};

int main()
{
    Foo f1;           //displays 0 (as expected)
    Foo f2(f1);       //displays 1 (as expected)
    someFunction(f1); //displays 1 (why?)
    someFunction(f2); //displays 1 (why?)

    return 0;
}

我不明白为什么函数“someFunction”调用第二个构造函数。我以为它只会调用第一个构造函数,没有参数,并显示 0。

也许我遗漏了一些明显的东西......

【问题讨论】:

  • someFunction 获取其参数的副本。 Foo(Foo &amp;f) 可以用作复制构造函数。 Foo(Foo const &amp;f) 会是更好的复制构造函数。

标签: c++ constructor copy-constructor


【解决方案1】:

第二个构造函数是一个copy构造函数,当你通过值传递一个参数给函数时,它是copyed,它调用了拷贝构造函数。

第一个构造函数(default构造函数)仅在从头开始创建对象时调用,并且不带任何参数。

【讨论】:

    【解决方案2】:

    因为当您调用 someFunction 时,编译器会调用复制构造函数将对象f1f2 复制到f

    为避免这种情况,只需使用 Foo 对象的引用参数声明函数,如下所示:

    int someFunction(Foo &f) {}
    

    然后照常调用:

    someFunction(f1);
    

    【讨论】:

      【解决方案3】:

      它永远不会调用默认构造函数,因为你只是在复制 foo 对象。它将使用复制构造函数,如果没有可用的复制构造函数,则使用与此类似的第二个构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        相关资源
        最近更新 更多