gpt4 book ai didi

c++ - 在 C++ 中返回对象或指针

转载 作者:可可西里 更新时间:2023-11-01 15:51:21 25 4
gpt4 key购买 nike

在 C++ 中,我的方法应该返回一个对象还是一个指向对象的指针?如何决定?如果是运营商呢?我该如何定义?

还有一件事——如果指针变成了一个 vector ,返回后我如何知道它的大小?如果这是不可能的,就像我认为的那样,我应该如何在没有这个限制的情况下正确地返回一个数组?

最佳答案

In C++, should my method return an object or a pointer to an object? How to decide?

从 C++11 开始,我们在 C++ 中有了移动语义,这意味着它像以前一样简单,现在也可以快速按值返回。那应该是默认的。

What if it's an operator? How can I define?

operator= 等许多运算符通常返回一个 reference*this

X& X::operator=(X rhs); 

如果你想遵守通常的模式(你应该这样做),你需要为每个运算符(operator)查找它。从这里开始:Operator overloading

正如 Ed S 所指出的。返回值优化也适用(甚至在 C++11 之前),这意味着您返回的对象通常既不需要复制也不需要移动。

所以,这是现在返回东西的方式:

std::string getstring(){ 
std::string foo("hello");
foo+=" world";
return foo;
}

我在这里创建了一个 foo 对象并不是我的重点,即使您只是执行 return "hello world"; 这就是要走的路。

And one more thing - if the pointer turns to be a vector, how can I find out its size after returned? And if it's impossible, as I think it is, how should I proceed to correctly return an array without this limitation?

标准中的所有可复制或可移动类型也是如此(这些几乎是所有类型,例如 vectorssets 等等),除了少数异常(exception)。例如 std::arrays 不会从移动中获益。它们花费的时间与元素的数量成正比。您可以在 unique_ptr 中返回它以避免复制。

typedef std::array<int,15> MyArray;
std::unique_ptr<MyArray> getArray(){
std::unique_ptr<MyArray> someArrayObj(new MyArray());
someArrayObj->at(3)=5;
return someArrayObj;
}

int main(){
auto x=getArray();
std::cout << x->at(3) <<std::endl; // or since we know the index is right: (*x)[3]
}

现在,为了避免再编写new(专家在极少数情况下除外),您应该使用名为make_unique 的辅助函数。这将极大地帮助异常安全,并且同样方便:

std::unique_ptr<MyArray> getArray(){ 
auto someArrayObj=make_unique<MyArray>();
someArrayObj->at(3)=5;
return someArrayObj;
}

有关 make_unique 的更多动机和(非常简短的)实现,请查看此处: make_unique and perfect forwarding

更新

现在 make_unique 是 C++14 标准的一部分。如果没有,您可以从 proposal by S.T.L.: 中找到并使用整个实现。

Ideone example on how to do that

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

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