zoukankan      html  css  js  c++  java
  • 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可以执行的原因了。

  • 相关阅读:
    Android成长之路-LayoutInflater和inflate的用法
    Android成长之路-实现简单动画
    Android成长之路-编码实现软件界面
    Android成长之路-手势库的创建
    Android成长之路-手势识别的实现
    Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
    android中文字中间有超链接的实现方法
    Arduino可穿戴教程ArduinoIDE新建编辑源文件
    FMDB使用SQLite事务Save Point
    FMDB使用Cached Statement功能
  • 原文地址:https://www.cnblogs.com/FWFC/p/8608279.html
Copyright © 2011-2022 走看看