gpt4 book ai didi

c++ - 在 C++ 中返回一个对象

转载 作者:可可西里 更新时间:2023-11-01 16:31:21 27 4
gpt4 key购买 nike

我学习 C++ 的背景主要是 C 和 Java,我很好奇在 C++ 中返回对象而无需复制对象的最佳方法是什么。根据我的理解,C++11 引入了右值引用 (&&) 来从临时变量中移动数据(与复制相反)。示例:

std::string getStr(){
return "Hello";
}

std::string &&hello = getStr();

我能想到的另一种方法是使用共享指针。

std::tr1::shared_ptr<std::string> getStr(){

std::tr1::shared_ptr<std::string> hello(new std::string("Hello"));
return hello;

}

auto hello = getStr();

我在想也许右值引用更好,但我想在使用它之前先听取第二意见。哪个更好?

另外,如果类中的字段不使用构造函数设置,是否建议将它们设为右值引用?示例:

class StringHolder{

public:
std::string &&str;
};

StringHolder sh;
sh.str = getStr();

非常感谢你们!

最佳答案

这个问题可能会作为重复问题被关闭。这是一个经常被问到的问题。不过我还是想回答一下。

在 C++11 中,当您是像 std::string 这样的对象的客户端时,您应该按值传递它,而不用太担心效率:

std::string getStr(){
return "Hello";
}

std::string hello = getStr();

在这个级别你不需要关心右值引用。只要知道 std::string 可以非常有效地从右值“复制”(例如从 getStr() 返回)。此“复制”实际上称为“移动”并自动启用,因为您正在从右值(匿名临时值)复制。

不要试图通过恢复引用计数来优化复制。仅当您需要共享所有权语义时才使用引用计数。这种说法并不总是正确。但对于学习基础知识来说,它已经足够接近,可以作为一个很好的经验法则来遵循。

当您设计需要按值传递的类时,您需要开始担心右值引用:

class Widget
{
// pointer to heap data
public:
// ...
};

有关右值引用和移动语义的简要介绍,N2027是一个不错的教程。 N2027 太长,无法粘贴到此处,但足够短,易于阅读。 std::string 遵循 N2027 中规定的基础知识,使您能够无罪地按值传递它。您可以在 Widget 中遵循这些相同的设计模式。

关于c++ - 在 C++ 中返回一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11379797/

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