C++ 中const的总结

  • const声明一个只读变量

  • 与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量,非const变量默认为extern。要是const变量能够在其他的文件中访问,必须显示地指定它为extern。

  • const引用能指向const变量或非const变量,非const引用只能指向非const对象

  • const引用可以初始化为不同类型的对象或者初始化为右值同样的初始化对于非const引用却是不合法的,而且导致编译错误

    int i = 42;
    double dval = 3.14;
    const int &ref1 = 42; //右值
    const int &ref2 = dval ; (这里编译器会转换为 int temp = dval; const int &ref2 = temp)如果这里ref2不是const,那么可以给ref2赋值,但实际上修改的是temp,所以不允许将非const引用初始化为不同类型的对象

  • 在const成员函数中,this指针是一个const类型的const指针,非const成员函数的中this位指向类类型的const指针。因此下面的例子不合法

    class A
    {
    public:
    A():x(32){}
    A &display_x() const //Error:无法将const A& 转换为 A&
    {
    cout << x;
    return *this;
    }
    void set_x(int val)
    {
    x = val;
    }
    private:
    int x;
    };
    如果在前面加上const 的话就不能这样使用
    A a = A();
    a.diaplay_x().set_x();
    一个解决方法是覆盖display_x()函数,则正确的定义如下
    class A
    {
    public:
    A():x(32){}
    const A &display_x() const
    {
    cout << x;
    return *this;
    }
    A &display_x()
    {
    cout << x;
    return *this;
    }
    void set_x(int val)
    {
    x = val;
    }
    private:
    int x;
    };

  • const 对象只能只能使用const 成员(数据成员和函数成员)。非const对象可以使用任意成员。

  • 如果要在const修改数据成员,则数据成员必须用mutable 声明

  • 构造函数或析构函数不可以使用类型限定符,也就不可以声明为const。

  • 成员函数如果声明为const,则在定义时也需要加上const

  • 对于const的数据成员必须在初始化列表初始化。唯一例外的是static const int变量可以在类中定义初始化(注意这里限定为整形,这里包括char、int、 long、枚举,不包括double,至于为什么目前不清楚)这里不同编译器处理并不同,VS2010上double型的报错,而在codeblock 编译却是合法的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值