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;指针。
答案 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对象)导致未定义的行为。