【问题标题】:Obtaining an object with pointer and reference [duplicate]获取带有指针和引用的对象[重复]
【发布时间】:2013-05-28 16:28:22
【问题描述】:

假设我们有一个静态创建的对象 (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();

【问题讨论】:

  • 以前的 API 几乎鼓励程序员在处理完对象后调用delete,或者至少让他想知道如何清理。
  • 在第一种情况下,您必须记录谁拥有返回的指针,并希望客户阅读文档。请注意,两者都存在 const 正确性问题。
  • 在第一种情况下你可以返回NULL,所以调用者需要检查这个。
  • 如果您“允许”您的类的用户修改返回的对象(成员),则使用引用或指针。但是,如果您不需要那种“行为”,最好只返回成员的副本。
  • @MarkGarcia 我认为你错了(或者我可能没有理解你的意思。)引用和指针可以是const,因此不允许修改(以清晰易懂的方式。 ) 并且返回一个副本确实not 不允许修改,它只是意味着用户正在修改的对象与您持有的对象不同!此外,返回副本的缺点是必须复制对象。考虑返回一个按值持有的百万元素向量(这意味着一个副本,而不是移动。)

标签: c++


【解决方案1】:

在纯 C++ 中,我们很少使用指针。特别是原始指针。

大部分代码处理对象实例。由于 C++ 具有通过身份引用它们的引用,与 C 不同,获取地址和传递指针是为必须的情况保留的。喜欢:

  • 当您希望 NULL 表示缺席时
  • 当你想切换到不同的对象时(重新分配指针)
  • 转让所有权时

您的示例不适合任何类别,因此您使用参考。这会向用户传达对象将始终存在的消息。所以修复obj的时间很少,你可以继续someClassObj.getObject().someMethod()。第一种情况需要在两者之间进行 NULL 检查。

【讨论】:

  • 优秀,全面,简洁!
【解决方案2】:

返回一个指针会引发很多歧义/问题(它可以是 NULL 吗?我必须 delete 吗?),而返回对这个静态实例的引用会引入保证。也就是说,该对象将始终被分配并始终返回一个实例(从技术上讲,如果您在初始化期间访问它,则可能不会构造该静态实例)。

虽然它是实现定义的,但我知道的所有实现在通过引用传递时(在最坏的情况下)都“在后台”使用指针。因此,除非必须引入副本或促销,否则使用参考不会增加成本。

在这种情况下,您应该返回一个引用。在大多数 C++ 圈子中,当引用提供您需要的所有功能时,引用比指针更受青睐。

【讨论】:

    猜你喜欢
    • 2018-07-24
    • 2017-04-25
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2011-02-12
    相关资源
    最近更新 更多