返回C 中的对象或指针
Returning an object or a pointer in C++
在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";
这就是要走的方法。
还有一件事 - 如果指针变为向量,我该怎么能 返回后找出大小?如果这是不可能的,我认为 这是,如果没有这个,我应该如何正确返回数组 限制?
对于标准中的所有可复制或可移动类型的类型也是如此(这些类型几乎是所有类型,例如vectors
,sets
等),除了少数例外外。例如,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
或类似的东西。
- 为什么指针对象没有调用默认构造函数
- 如何访问双指针对象中的方法
- 如何使用智能指针对象执行成员函数指针
- 调用带有指针对象错误的指针变量
- 如何从模板类重载创建的指针对象上的运算符?
- C++指针对象的运算符重载
- 如何初始化数组指针对象
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- C++指针对象差异
- 涉及继承,指针对象的交易以及何时进行的问题
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 字符指针对象和相应的字符数组元素比较
- 如何在 c++ 中克隆为弱指针对象
- 指针对象使用CPP中的指针表达式进行比较
- Visual Studio中智能指针对象的自定义视图
- 使用指针 /对象 /模板参数正确构成
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 如何将值分配给指针对象 c++
- 更改智能指针对象,然后访问它