【问题标题】:C++ Accessors - should I return a pointer to the member variable or the actual member variable itself?C++ 访问器 - 我应该返回指向成员变量的指针还是实际的成员变量本身?
【发布时间】:2012-07-06 21:29:14
【问题描述】:

我希望这里是一个简单的问题。对于我的类的成员变量,所有这些都是私有的,我应该使用访问器返回指针还是返回变量本身?还是我应该做点别的?

例子:

unsigned int *Object::GetObjectIDPointer()
{
    return &objectID;
}

unsigned int Object::GetObjectID()
{
    return objectID;
}

【问题讨论】:

  • 最好的办法是避开访问者。
  • 返回非指针时不要命名为GetXxxxPointer。
  • @harper 当我提出问题时,这是一个小的复制粘贴错字。 >
  • 您的第一个示例实际上将“私有”变量公开,这与private 的观点相反。

标签: c++ variables pointers member accessor


【解决方案1】:

这在很大程度上取决于你想用它们做什么:如果你计划你的类的用户能够修改你的类中的变量(这是一件可怕且强烈不鼓励的事情),你可以返回指针或引用;否则,返回变量本身。

当您要返回的对象很大时,例如向量、集合、映射等,此规则有一个例外。如果您决定为它们创建访问器,则应通过常量引用返回它们。

【讨论】:

  • 我不同意。几乎不应该返回指向成员的指针,也不应该从 getter 函数按值返回。几乎总是返回引用和 const 引用。
  • @MooingDuck 我在编写模板代码时遵循此规则并返回引用,但在非模板代码中我会根据具体情况做出决定。例如,出于纯粹的审美原因,我通过值而不是通过 const 引用返回 int
【解决方案2】:

这取决于你的方法

GetObjectIDPointer() 

如果它是私有方法,那么使用指针,因为它会使您的成员访问速度更快。但是如果方法是公开的,你应该总是返回一个副本。如果你返回一个指针,它将违反 OOPS(数据隐藏)的基本原则。

【讨论】:

  • 在私有函数中通过指针返回成员是愚蠢的。
【解决方案3】:

我会说,采取第二种解决方案。
更一般地说,您可以返回对象本身的副本,编译器可能会使用 copy elision optimization 优化掉任何不必要的副本。

您还可以返回对该字段的 const 引用:

const MyType& getMyField() const { return this->myField; }

这样,不会创建副本并且无法修改值(const_cast 除外)。

但是对于一个 int,我认为你应该返回一个副本,就像你的第二个解决方案一样:

unsigned int Object::GetObjectIDPointer()
{
    return objectID;
}

【讨论】:

  • 然而,返回引用可能很危险。调用者也可以保存引用 (const MyType& m = something.getMyField();),这可能会变得悬空。
  • @phresnel:指针也有同样的问题,解决方法可能非常缓慢。通过引用返回是最好的选择。 olchauvin:RVO 仅在您返回局部变量时才有帮助。返回成员时,仍然需要进行完整的复制。
  • @MooingDuck 你说得对,我的意思是“复制省略”。我更正了答案。
【解决方案4】:

如果你只是想能够得到值,那么就按值返回。另外,声明函数const。但是,如果它很大或复制成本很高,最好返回一个 const 引用,以便调用者可以选择不复制它。

如果您还希望能够修改它,那么要么返回一个引用(或者如果你喜欢的话,一个指针),或者提供一个“set”函数。或者,只需将其公开 - 假装它不是封装的,没有多大意义。

如果您确实返回了一个引用(或指针),那么请确保您有一个 const 重载,否则您将无法从 const 对象中读取值:

const unsigned int *Object::GetObjectIDPointer() const
{
    return &objectID;
}

【讨论】:

  • 我不同意。几乎不应该返回指向成员的指针,也不应该从 getter 函数按值返回。几乎总是返回引用和 const 引用。
  • @MooingDuck:正如我所说,取决于类型。按值返回小型 POD 类型(如问题中的那个)通常比按引用更快、更安全;我建议引用比指针更可取,但如果 OP 更喜欢指针,则不想指定样式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
相关资源
最近更新 更多