这是一个更好的Get成员方法

Which is a better Get member method?

本文关键字:更好 Get 成员方法 一个      更新时间:2023-10-16

我有一个类,它有一个类型为std:vector 的成员

  private:
     std::vector<int> myVector;

我创建了Get方法来访问myVector

1. const std::vector<int>   GetMyVector() const;
2. const void   GetMyVector(std::vector<int>& vec) const;

实现方式分别如下:

1. const std::vector<int> MyClass::GetMyVector() const
   {
       return  myVector;
   }
2. const void MyClass::GetMyVector(std::vector<int>& vec) const
   {
       vec =  myVector;
   }

两种Get方法中哪一种更好,为什么?

我更喜欢选项3:

const std::vector<int>& MyClass::GetMyVector() const
{
    return  myVector;
}

您的选项1返回了myVector的副本。这将返回对类成员的const(只读)引用。

为什么要返回向量?

int MyClass::GetItem(const size_t index) const
{
    return myVector[index];
}

首先,当您从成员函数返回类的私有成员时,您将公开您的实现,这通常是糟糕的设计。看看@JoachimPileborg的解决方案,了解如何避免这种情况。

如果要返回副本,则应按值返回。

如果要返回对对象的引用,请按引用返回但是请记住,当对象被破坏时,您最终会得到一个悬空引用,例如

class Foo {
public:
    std::vector<int>& getVec() {
        return myVec;
    }
private:
    std::vector<int> myVec;
};
int main() {
    Foo* f = new Foo();
    std::vector<int>& myRef = f->getVec();
    delete f;
    std::cout << myRef.size(); // The demons come! Dangling reference!
}

正因为如此,返回副本而不是引用通常是正确的做法。

如果通过复制返回对象,那么将其声明为const是没有任何意义的。所以不是

const std::vector<int> MyClass::GetMyVector() const
{
    return  myVector;
}

我会写

std::vector<int> MyClass::GetMyVector() const
{
    return  myVector;
}

第二个声明比第一个声明更糟糕,因为它只会混淆用户。不清楚是将类的相应数据成员分配给了参数,还是该方法在不将相应数据成员指定给参数的情况下对参数进行了一些更改。

所以考虑到你建议的变体,我会选择声明

std::vector<int> MyClass::GetMyVector() const
{
    return  myVector;
}

根据经验,始终尝试返回类成员的const reference。所以使用const std::vector<int> & MyClass::GetMyVector() const