哪个是更好的Get成员方法?

时间:2013-12-03 17:11:11

标签: c++ class vector stdvector accessor

我有一个类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方法中的哪一种更好,为什么?

5 个答案:

答案 0 :(得分:8)

我更喜欢选项3:

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

您的选项1返回了myVector的副本。这将返回对类成员的const(so read-only)引用。

答案 1 :(得分:1)

为什么要返回矢量?

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

答案 2 :(得分:1)

首先,当您从成员函数返回类的私有成员时,您将公开您的实现,这通常是错误的设计。看一下@ 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!
}

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

答案 3 :(得分:0)

如果要按副本返回对象,则没有任何意义将其声明为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;
}

答案 4 :(得分:-1)

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