从成员get方法返回const引用

时间:2014-09-09 15:17:25

标签: c++ class methods const member

typedef vector<int> intvec;

class MyClass
{
    intvec m_member;
public:
    const intvec& GetVec();
};

const intvec& MyClass::GetVec()
{
    return m_member;
}

int main(int argc, char *argv[])
{
    MyClass myClassObj;

    myClassObj.GetVec().push_back(11); //This doesn't work with const reference
    myClassObj.GetVec().push_back(22); //This doesn't work with const reference

    for(intvec::const_iterator iter = myClassObj.GetVec().begin(); iter != myClassObj.GetVec().end(); ++iter)
    {
        cout << *iter << ", " ;
    }

    cout << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

如果GetVec()的返回类型是非const引用,则myClassObj.GetVec().push_back(11);有效,但对于const引用返回,这不起作用(编译错误)。我理解如果GetVec()方法本身是const,即const intvec& GetVec() const;,那么myClassObj.GetVec().push_back(11);将无法工作,因为这意味着修改&#34;这个&#34;指针。

3 个答案:

答案 0 :(得分:4)

你可以重置const资格的功能:

const intvec& GetVec() const;    // Can access, but not modify, a const object
intvec& GetVec();                // Can access or modify a non-const object

或者您可以将数据成员公开并具有完全相同的限制。除非它们用于限制访问或维护类不变量,否则访问器函数没有什么意义,这些不是。

答案 1 :(得分:1)

预计像push_back这样的修改函数不能用在const引用上。假设push_back是一个将项附加到数组的东西,它构成了对象的修改,所以如果对象是常量那么你就不能这样做。

答案 2 :(得分:0)

  

我理解如果GetVec()方法本身是const,即const   INTVEC&安培; GetVec()const;,然后是myClassObj.GetVec()。push_back(11);   不会起作用,因为这意味着修改&#34;这个&#34;指针

这是对的。并且getter函数应该有const,这会阻止你修改&#34;这个&#34;。

const intvec& MyClass::GetVec() const { return m_member; }

getter函数通常用于读取数据。如果需要,您的类(m_member的所有者)应该是修改该成员的类。如果你可以从类外部修改成员,那么就会失去对m_member被更改的人的控制(使调试变得困难并降低开发人员的可读性)。

如果您想更改m_member,通常会在您的类中添加一个方法来执行此操作。

  

如果GetVec()的返回类型是非const引用则   。myClassObj.GetVec()的push_back(11);有效,但供const参考   返回此功能(编译错误)。

你根本无法在const向量上推送一个元素,因为它不会是一个const向量:)。我认为你对const关键字感到有些困惑。

const对象 - 类型为const限定的对象,或const对象的不可变子对象。 此类对象无法修改:尝试直接执行此操作是编译时错误,并尝试间接执行此操作(例如,通过引用或指向非const类型的指针修改const对象)导致未定义的行为。