3

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

例子:

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

或者

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

4 回答 4

4

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

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

于 2012-07-06T12:10:37.530 回答
2

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

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

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

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

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

unsigned int Object::GetObjectIDPointer()
{
    return objectID;
}
于 2012-07-06T12:15:08.200 回答
1

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

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

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

const unsigned int *Object::GetObjectIDPointer() const
{
    return &objectID;
}
于 2012-07-06T14:46:49.057 回答
-1

这取决于你的方法

GetObjectIDPointer() 

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

于 2012-07-06T12:14:09.667 回答