如何知道临时对象何时被创建和销毁?

时间:2014-01-18 07:39:20

标签: c++ oop

如何找出创建和销毁临时对象的时间以及如何?

举个例子,假设我们有一个名为Foo的类 和一个返回Foo对象的函数,它的参数是一个对象,一个对象的引用。

Foo func(Foo a ,Foo & b);

我知道创建了多少个对象?
它是使用复制构造函数还是常规创建的?

1 个答案:

答案 0 :(得分:3)

使用构造函数和析构函数,在其中插入print语句。

#include <iostream>

class Foo
{
    public:
        Foo(){}
        Foo(const Foo &other) {std::cout<<"A copy was made\n";}
        Foo(Foo &&other) {std::cout<<"Foo was moved\n";}
        ~Foo(){std::cout<<"Destroyed Foo\n";}
};


Foo func(Foo a, Foo &b)
{
    return a;
}

Foo func_const(const Foo &a, Foo &b)
{
    return a;
}

Foo func_temp()
{
    return Foo();
}

int main()
{
    Foo f;
    func(f, f);

    std::cout<<"\n\n\n";

    func_const(f, f);

    std::cout<<"\n\n\n";

    Foo g = func_temp();
}

以上打印(使用ideone):

Foo constructed
A copy was made
Foo was moved
Destroyed Foo
Destroyed Foo



A copy was made
Destroyed Foo



Destroyed Foo
Destroyed Foo

使用功能签名:

Foo func(Foo a, Foo &b),参数a可以制作副本。编译器的优化也可以省略该副本。参数b永远不会复制,因为它是通过引用传递的,并且通常表示您将修改传递的对象;不修改副本。

返回Foo时,它可能会也可能不会返回副本。这取决于你班级的定义。见http://en.wikipedia.org/wiki/Return_value_optimization