c++按值返回对象
C++ returns objects by value
问题的主题就在题目中。我在Meyrses的书《Effective c++》中看到了这一点:
c++按值返回对象的事实
这是什么意思? c++标准是如何支持这个消息的?例如,假设我们有这样的内容:
int foo()
{
int a = 1;
return a;
}
很明显,这个短语意味着返回存储在局部变量中的值的副本。但是考虑一下:
int& foo()
{
int a = 1;
return a;
}
编译器应该警告我们返回对局部变量的引用。"按值返回事实"如何适用于该示例?
Meyers基本上是正确的,不过在处理参考文献时,您必须对这种措辞持保留态度。在某个抽象级别上,这里你是"按值"传递引用本身。
但他真正想说的是,除此之外,c++默认按值传递,这与Java等语言形成对比,在这些语言中,对象总是被引用语义所抛弃。
事实上,一个可以争辩说这段话根本不适用于你的代码,因为引用不是一个"对象"。
当书中说" c++按值返回对象"时,它解释了当你使用"普通"类名作为返回类型而没有额外的"装饰"(如&号或星号)时会发生什么,例如
struct MyType {
... // Some members go here
};
MyType foo() {
...
}
在上面的例子中,foo()
按值返回一个对象。
这个引语不应该暗示c++缺乏从函数返回数据的其他方法:因为你可以很容易地构造一个返回引用或指针的函数。
注意,只有在返回指向局部对象的指针或引用时,通过指针或引用返回对象才会产生未定义行为。访问超过其生存期的对象总是会导致未定义的行为。返回局部的by引用或by指针可能是导致这种未定义行为的最常见错误。
Return by reference会给你一个错误,因为你将一个变量的引用传递给另一个函数(调用函数foo的函数),而这个函数超出了该局部变量(变量a)的作用域。
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 如何访问从 COM 对象返回的 VARIANT 数据类型中的安全数组C++?
- 从我的对象返回静态数组
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 从右值对象返回成员
- 视觉对象 返回 C++ 中的双精度值
- 为什么类型为 sf::Text 的对象返回不同的 getPosition().y 和 getLocalBounds().
- std::min_element 从类对象返回意外结果
- C++无效的对象返回语义
- const引用是否延长临时对象返回的临时对象的寿命
- 将 NULL 作为对象返回时未收到任何警告
- 如何在 C# 中从 com 对象返回数组(double[])
- 从重载运算符返回引用,并使用临时对象返回表达式
- Cin 对象返回值 c++
- 将变量作为类对象返回
- 使用可更改对象返回只读的最佳方法是什么
- 如何在Cython中从另一个包装对象返回包装的c++对象
- 当对象返回时,c++动态数组被清除
- 从带有动态字段的函数、对象返回
- 从堆栈上的匿名对象返回对*this的引用