我正从 Java 转向 C++,对该语言的灵 active 有点困惑。有一点是,对象的存储方式有指针、引用和标量(如果我没理解错就是存储对象本身)。
我倾向于尽可能使用引用,因为它尽可能接近 Java。在某些情况下,例如派生属性的 setter/getter ,这是不可能的:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
这不会编译,因为 t
只存在于 getSomeAttribute()
的范围内,如果我返回对它的引用,它会在客户端可以之前指向任何地方使用它。
因此我有两个选择:
- 返回一个指针
- 返回一个标量
返回一个指针看起来像这样:
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/