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可以执行的原因了。