c++ - 在 C++ 中何时返回指针、标量和引用?

标签 c++ pointers reference scalar

我正从 Java 转向 C++,对该语言的灵 active 有点困惑。有一点是,对象的存储方式有指针、引用和标量(如果我没理解错就是存储对象本身)。

我倾向于尽可能使用引用,因为它尽可能接近 Java。在某些情况下,例如派生属性的 setter/getter ,这是不可能的:

MyType &MyClass::getSomeAttribute() {
    MyType t;
    return t;
}

这不会编译,因为 t 只存在于 getSomeAttribute() 的范围内,如果我返回对它的引用,它会在客户端可以之前指向任何地方使用它。

因此我有两个选择:

  1. 返回一个指针
  2. 返回一个标量

返回一个指针看起来像这样:

MyType *MyClass::getSomeAttribute() {
    MyType *t = new MyType;
    return t;
}

这行得通,但是客户端必须检查此指针是否为 NULL 才能真正确定,这对于引用来说不是必需的。另一个问题是调用者必须确保释放 t,如果可以避免的话,我宁愿不处理它。

另一种方法是返回对象本身(标量):

MyType MyClass::getSomeAttribute() {
    MyType t;
    return t;
}

这非常简单明了,正是我在这种情况下想要的:感觉就像一个引用,而且不能为空。如果对象超出客户代码的范围,则将其删除。非常方便。但是,我很少看到有人这样做,这是有原因的吗?如果我返回标量而不是指针或引用,是否会出现某种性能问题?

处理这个问题最常见/最优雅的方法是什么?

最佳答案

按值返回。编译器可以优化拷贝,所以最终结果就是你想要的。创建一个对象,并返回给调用者。

我认为您很少看到人们这样做的原因是您正在查看错误的 C++ 代码。 ;) 大多数来自 Java 的人对做这样的事情感到不舒服,所以他们到处调用 new。然后他们到处都是内存泄漏,必须检查 NULL 和所有其他可能导致的问题。 :)

可能还值得指出的是,C++ 引用与 Java 引用几乎没有共同之处。 Java 中的引用更类似于指针(它可以重新定位,或设置为 NULL)。 事实上,唯一真正的区别是指针也可以指向垃圾值(如果它未初始化,或者它指向一个超出范围的对象),并且您可以对指向大批。 C++ 引用是对象的别名。 Java 引用的行为并非如此。

关于c++ - 在 C++ 中何时返回指针、标量和引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5849902/

相关文章:

c++ - 如何制作指针迭代器?

c++ - 将复制返回的值分配给引用

c++ - 函数指针,未在此范围内声明

c++ - 我对缓冲区的理解是否正确?

c++ - 指针函数参数数组 - 奇怪的行为

c - scanf 和 printf 仅使用整数指针在数组中显示 10 个数字//不能使用整数而不是 A[]。 +1 更多

reference - 在 Kotlin 中将 ArrayList 转换为 List 时的不变性问题

c++ - 此代码如何使用整数为您提供引用?

c++ - 我的代码和巴比伦之间的动画差异,为什么?

c++ - boost 是否支持 c++11 的 std::tuple 的序列化?