返回C 中的对象或指针

Returning an object or a pointer in C++

本文关键字:指针 对象 返回      更新时间:2023-10-16

在C 中,我的方法是否应该返回对象或指针到对象?如何决定?如果是操作员怎么办?我该如何定义?

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

在C 中,我的方法应该返回对象还是指针转换为对象? 如何决定?

由于C 11,我们在C 中具有移动语义,这意味着它像以前一样容易,现在也可以快速按值返回。那应该是默认值。

如果是操作员怎么办?我该如何定义?

许多运营商(例如operator=)通常将A 参考返回到*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 ::数组不会从移动中获得。他们花时间与元素数量成正比。您可以在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 Expracting

更新

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

IDEONE示例

在C 中,我的方法应该返回对象或指针转换为对象吗?

您默认情况下应返回对象。通常的例外是返回给定类的子类的函数,当返回时,什么都不是函数的合法选择 1

如果是操作员怎么办?

操作员返回引用或对象;尽管从技术上讲可以从超负荷运算符中返回指针,但通常不是这样做。

还有一件事 - 如果指针变成向量,我该如何在返回后找出大小?

我认为您的意思是 array 而不是 vector ,因为 std::vector具有 size()成员函数返回向量的大小。确实无法找到可变长度阵列的大小。

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

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


1 在这种情况下,您返回NULL或C 11中的nullptr

,除非有某些特定理由使用普通指针,否则请始终返回一些内存安全。在所有情况中,估计有95%的情况,仅返回对象就可以了,然后逐价返回绝对是典型的事情(简单,高效,好!)。

剩余的5%主要是当返回的对象为运行时 - 晶状体时;这样的对象不能通过C 中的值返回,因为那会发生在堆栈上。在这种情况下,您应该将智能指针返回新对象,在C 11中,标准选择是std::unique_ptr。当您要选择返回某物时,也有这种情况,但这是IMO的特定容器的情况,而不是指针,boost::optional或类似的东西。