繁体   English   中英

在C ++中返回一个对象或指针

[英]Returning an object or a pointer in C++

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

还有一件事 - 如果指针变成矢量,我怎样才能在返回后找出它的大小? 如果这是不可能的,我认为它应该如何在没有这个限制的情况下正确返回数组?

在C ++中,我的方法应该返回一个对象或指向对象的指针吗? 怎么决定?

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

如果是运营商怎么办? 我该如何定义?

许多运算符(如operator=通常会返回对*this引用

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

如果您想遵守通常的模式(并且您应该),您需要为每个操作员查找。 从这里开始: 运算符重载

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

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

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

我在这里制作foo对象的事实不是我的观点,即使你确实只是return "hello world"; 这是要走的路。

还有一件事 - 如果指针变成矢量,我怎样才能在返回后找出它的大小? 如果这是不可能的,我认为它应该如何在没有这个限制的情况下正确返回数组?

标准中的所有可复制或可移动类型也是如此(除了少数例外,它们几乎都是所有类型,例如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一下: make_unique和完美转发

更新

现在make_unique是C ++ 14标准的一部分。 如果您没有,可以从STL提案中找到并使用整个实现

关于如何做到这一点的Ideone示例

在C ++中,我的方法应该返回一个对象或指向对象的指针吗?

您应该默认返回一个对象。 通常的异常是返回给定类的子类的函数,当返回任何内容时,函数1的合法选项。

如果是运营商怎么办?

运算符返回引用或对象; 虽然技术上可以从重载运算符返回指针,但通常不会这样做。

还有一件事 - 如果指针变成矢量,我怎样才能在返回后找出它的大小?

我认为你的意思是数组而不是向量 ,因为std::vector有一个size()成员函数返回向量的大小。 找到可变长度数组的大小确实是不可能的。

如果这是不可能的,我认为它应该如何在没有这个限制的情况下正确返回数组?

你应该使用std::vector ,它不会限制你进入它的元素的大小或类型。


1在这种情况下,您在C ++ 11中返回NULLnullptr

除非有一些特定的理由使用普通指针,否则总是返回一些内存安全的东西。 在大约95%的情况下,简单地返回对象很好,然后按值返回绝对是规范的事情(简单,高效,好!)。

剩下的5%主要是返回的对象是运行时多态的; 这样的对象不能通过C ++中的值返回,因为这会在堆栈上发生。 在这种情况下,您应该返回一个指向新对象的智能指针 ,在C ++ 11中标准选择是std::unique_ptr 还有一种情况,你想要选择性地返回一些东西,但这是IMO特定容器的情况,而不是指针, boost::optional类似的东西

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM