让我们假设我们有一个静态创建的对象(Type mObject;
),它通过使用getObject()方法向程序员公开。我想知道以这种方式获取对象有什么优点和缺点?
Type* SomeClass::getObject() {
return &mObject;
}
// the programmer types
Type* obj = someClassObj.getObject();
obj->someMethod();
这样:
Type& SomeClass::getObject() {
return mObject;
}
// the programmer types
Type& obj = someClassObj.getObject();
obj.someMethod();
答案 0 :(得分:5)
在纯C ++中,我们很少使用指针。特别是原始指针。
大多数代码都处理对象实例。由于C ++具有通过身份引用它们的引用,与C不同,获取地址和传递指针是为必须的情况保留的。像:
您的示例不适合任何类别,因此您使用引用。这会向用户传达一个对象将始终存在的信息。因此,大部分时间都没有必要修复obj,你可以继续使用someClassObj.getObject().someMethod()
。第一种情况需要在它们之间进行NULL检查。
答案 1 :(得分:1)
返回一个指针引发了很多歧义/问题(可能是NULL吗?我必须delete
吗?),而返回对这个静态实例的引用会引入保证。也就是说,对象将始终被分配并始终返回一个实例(从技术上讲,如果在初始化期间访问它,则可能无法构造该静态实例)。
虽然它是实现定义的,但我所知道的所有实现在通过引用传递时都会使用指针(在最坏的情况下)。因此,除非必须引入副本或促销,否则使用引用不会增加成本。
在这种情况下,您应该返回一个引用。在大多数C ++圈子中,当引用提供您需要的所有功能时,引用比指针更受青睐。