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

还有一件事-如果指针变成 vector ,返回后如何找出其大小?如果不可能,如我所想,我应该如何继续正确地返回不受此限制的数组?

最佳答案



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



许多运算符(例如operator=)通常会返回对*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";也是这样。



除了少数异常(exception),标准中的所有可复制或可移动类型(几乎都是所有类型,例如vectorssets等等)也是如此。例如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

07-28 03:03
查看更多