C ++访问器 - 我应该返回指向成员变量或实际成员变量本身的指针吗?

时间:2012-07-06 12:08:02

标签: c++ variables pointers member accessor

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

示例:

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

OR

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

4 个答案:

答案 0 :(得分:4)

这很大程度上取决于你想对它们做些什么:如果你计划你的类的用户能够修改你的类中的变量(一个可怕而且非常沮丧的东西),你可以返回指针或引用;否则,返回变量本身。

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

答案 1 :(得分:2)

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

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

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

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

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

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

答案 2 :(得分:1)

如果您只想获取值,请按值返回。另外,声明函数const。但是,如果复制它很大或很昂贵,最好返回const引用,以便调用者可以选择不复制它。

如果您还希望能够修改它,则返回引用(或指针,如果您喜欢),或提供“set”功能。或者,只需将其公之于众 - 假装它不是封装的,没有多大意义。

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

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

答案 3 :(得分:-1)

这取决于你的方法

GetObjectIDPointer() 

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