gpt4 book ai didi

c++ - 我怎么知道临时对象何时被创建和销毁?

转载 作者:行者123 更新时间:2023-11-30 02:49:25 25 4
gpt4 key购买 nike

我如何知道何时创建和销毁临时对象以及如何?

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

Foo func(Foo a ,Foo & b);

有多少对象是在我知道的情况下创建的?
它是使用复制构造函数还是常规创建的?

最佳答案

使用构造函数和析构函数,向其中插入打印语句。

#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 时,它可能会也可能不会返回拷贝。这取决于你的类(class)的定义。参见 http://en.wikipedia.org/wiki/Return_value_optimization

关于c++ - 我怎么知道临时对象何时被创建和销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21201444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com