the*_*one 33 c++ scalar pointers reference
我正在从Java转向C++,并且对语言的灵活性感到有些困惑.有一点是存储对象的方法有三种:指针,引用和标量(如果我理解正确,则存储对象本身).
我倾向于尽可能使用引用,因为它尽可能接近Java.在某些情况下,例如派生属性的getter,这是不可能的:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为t只存在于范围内,getSomeAttribute()并且如果我返回对它的引用,它将在客户端可以使用之前指出它.
因此,我有两个选择:
返回指针看起来像这样:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Run Code Online (Sandbox Code Playgroud)
这样做,但客户端必须检查此指针NULL才能确定,这是引用不必要的.另一个问题是调用者必须确保t解除分配,如果我可以避免它,我宁愿不处理它.
另一种方法是返回对象本身(标量):
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
Run Code Online (Sandbox Code Playgroud)
这非常简单,正是我在这种情况下想要的东西:感觉就像一个引用,它不能为空.如果对象超出客户端代码的范围,则会将其删除.非常方便.但是,我很少看到有人这样做,这有什么原因吗?如果我返回标量而不是指针或引用,是否存在某种性能问题?
处理这个问题最常见/最优雅的方法是什么?
jal*_*alf 24
按价值返回.编译器可以优化掉副本,因此最终结果就是您想要的.创建一个对象,并将其返回给调用者.
我认为你很少看到人们这样做的原因是因为你正在查看错误的C++代码.;)大多数来自Java的人都觉得做这样的事情很不舒服,所以他们会new到处打电话.然后他们在整个地方都会出现内存泄漏,必须检查NULL以及可能导致的所有其他问题.:)
值得指出的是,C++引用与Java引用几乎没有共同之处.Java中的引用更类似于指针(可以重新设置,或设置为NULL).实际上唯一真正的区别是指针也可以指向垃圾值(如果它未初始化,或指向超出范围的对象),并且您可以在指针上执行指针算术阵列.C++引用是对象的别名.Java引用的行为与此类似.