【问题标题】:return value as a function argument返回值作为函数参数
【发布时间】:2011-08-30 01:33:06
【问题描述】:

我在why my local object destroyed twice? 之前发布过类似的问题,但我对其他问题感到困惑。

这是程序:

class AT
{
public:
    int a;

    AT() { cout<<"construct"<<endl; }

    AT(const AT& at) { cout<<"copy"<<endl; }

    ~AT() { cout<<"destroy"<<endl; }
};

AT func(AT at)
{
    return at;
}

AT func2(AT at)
{
    at.a = 5;
    return at;
}

然后我打电话:

AT at;
func2(func(at));

输出是:

construct
copy
copy
destroy
copy
destroy
destroy

我想输出会有4个副本和4个销毁,我在func(at)中很清楚,参数被复制,返回值被复制,两者都被销毁。但是在 func2() 中,似乎没有复制参数。这是否意味着:如果将返回值传递给参数,则不会复制参数?

【问题讨论】:

    标签: c++ pass-by-value


    【解决方案1】:
    AT func(AT at)
    {
        return at;
    }
    

    可能是一些编译器优化。

    At 不是创建后才被销毁的。 而是使用 func 的参数直接创建 func2 的参数,就好像你调用了 func2(at);

    【讨论】:

    • 我在VS2010中编译,关闭了优化。
    • msdn.microsoft.com/en-us/library/a8kfxa78(v=vs.80).aspx "因为返回值没有复制到另一个对象,所以创建了一个临时对象。"所以在 func2(func(at)) 中没有临时创建。
    • 好的,我明白了。如果将返回值分配给某个对象,则不会创建临时对象。如果没有赋值,则创建一个临时对象。
    猜你喜欢
    • 2010-10-14
    • 2015-04-11
    • 1970-01-01
    • 2017-11-09
    • 2014-03-19
    • 1970-01-01
    • 2020-10-04
    • 2018-04-09
    • 2021-10-02
    相关资源
    最近更新 更多