C++:容器的const类型操作

当对一个vector修饰const的时候,const所限定的东西到底是什么呢?是限定其内部不能添加元素呢?还是限定其内部元素不可改变呢?

代码如下:

#include<iostream>
#include<vector>

using std::cout;
using std::cin;
using std::endl;
using std::vector;


int main()
{
    const vector<int> vecInt = {1,2,3,4,5,6};
    
    vecInt.push_back(7);
    for(auto it = vecInt.begin();it != vecInt.end();++it)
    {
        if(*it == 3)
            *it = 0;
    }
    for(vector<int>::const_reference rs : vecInt)
    {
        cout<<rs<<endl;
    }
    return 0;
}

这段代码根本编译不通过,当然,这是意料之中的事。我们来看错误提示:

14行和18行都出了错。

14行是在强调没有可转换的this指针,这个很好理解,当我们定义一个类的对象为const时候,其this指针也被定义为const,只能调用const的成员函数(当然调用普通成员变量成员对象是没有问题的,只是由于const的限定仍然不能对其改变),所以其push_back函数(由于需要对对象内元素进行改变,所以一定是普通成员函数)所以无法被调用。

18行则是在说,(由于this指针被限定为const)迭代器it无法被赋值。这应该意味着,对于类内部的指针或迭代器变量,当this指针被加上const限定符的时候,其内部各种成员变量成员对象应该是被加上了底层const(对于指针或迭代器而言,即可改变其本身而不可改变其所指向的对象)。

另外,在15行我们可以看见++it是没有问题的,这也证明it本身此时应该是一个底层的const迭代器变量。除此之外,15行的begin和end函数可以被调用也间接说明了这两个函数应该是const的函数,但其返回值并不是const的迭代器(其实也对,因为明显cbegin和cend应该返回这样的迭代器)。这也就说明了为什么++it可以执行的原因了。

 

posted @ 2018-03-20 11:35  泛未分晨  阅读(543)  评论(0编辑  收藏  举报