我正在从 Java 迁移到 C++,并且对该语言的灵活性有点困惑。有一点是存储对象的三种方法:指针、引用和标量(如果我理解正确,存储对象本身)。
我倾向于尽可能使用引用,因为它尽可能接近 Java。在某些情况下,例如派生属性的 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;
}
这很简单,这正是我在这种情况下想要的:感觉就像一个参考,它不能为空。如果对象超出客户端代码的范围,则将其删除。很方便。但是,我很少看到有人这样做,这是有原因的吗?如果我返回标量而不是指针或引用,是否存在某种性能问题?
处理这个问题的最常见/最优雅的方法是什么?