zoukankan      html  css  js  c++  java
  • const 和 constexpr

    在C++中,const 这个关键字用法非常灵活,导致我总会搞不清作用是干啥的。灵活使用const会大大改善程序。

    const 是C++的一种类型修饰符,是不可改变的不能被更新的。

    1.const 修饰成员变量

      const int a = 1;  此时的a在后面的操作中不能被改变,否则会报错

    2.const 修饰函数参数

      (1)void f( const int i ){}    防止意外的修改,增强程序的健壮性,同样在函数内不能被修改

      

      (2)void f(const int* i){}  指针所指的内容为常量不可变

      

      (3)void f(int* const i){}  指针本身为常量不可变

      

      (4)void f(const int& i){}  引用参数在函数内不可以改变

    3.const 与指针搭配

      (1)int* const a;  指针本身是常量不可变

      (2)const int* a;  指针指向的内容是常量,不可变

      (3)const int* const a;  两者都不能改变

    区别的方法:

      以*为分割线,如果 const 位于 * 的左侧,那么那个const就是用来修饰指针所指向的变量,也就是指针为常量。

      const 位于*右侧的时候,const 就是修饰指针本身,也就是指针本身是常量

    4.const 修饰函数的返回值

      (1) const int f(){}  返回的参数是常量(没有什么意义,因为返回的参数本来就是常量)

      (2)const int * f() {}  调用的时候相当于 const int *p = f();  即指针内容不可变

      (3)int* const f(){}  调用的时候相当于 int * const p = f();  指针本身不可变

    5.在类中的运用

      (1)修饰成员变量  就是不能被修改,只能在初始化列表中赋值

      (2)修饰成员函数

    class MyClass
    {
    ...
    void a()const{}  //常成员函数,不改变对象的成员变量(不能修改任何成员变量)

            //在这个函数中,不能调用非const 成员函数,因为非const 成员函数可能会修改成员变量
    };

      (3)修饰对象

      const 修饰的类对象中,表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样的。

      还有const 修饰的对象只能调用const 修饰的成员函数,因为非const修饰的函数都有可能修改成员变量。

    5.将const 类型转化为非const 类型

    方法:采用const_cast 进行转换

    即 const_cast<type_id> (expression)

    常量指针被转化成非常量指针,并且仍然指向原来的对象;

    常量引用被转换成非常量引用,并且仍然指向原来的对象;

    常量对象被转换成非常量对象。

    6.constexpr

    constexpr是C++11中增加的关键字,他的意思是“常量表达式”,在编译期可求值的表达式。

    (1)constexpr变量必须在编译的时候进行初始化。所有的constexpr变量均为常量,所以修饰的变量必须要是在编译期可求值的。

    (2)与const 不同,constexpr申明中如果定义了一个指针,限定符constexpr仅仅对指针有效,与指针所指的对象无关。

  • 相关阅读:
    于丹的婚姻观
    相貌与成功的关系—俞敏洪6月2号在同济大学的演讲
    NetBeans IDE 6.9.1 发布
    NetBeans IDE 6.9.1 发布
    NetBeans 时事通讯(刊号 # 112 Aug 05, 2010)
    VS Feature Pack学习之使用CMFCMenuBar自定义菜单栏
    使用 Apache Wink、Eclipse 和 Maven 开发 RESTful Web 服务
    Have to run sudo dhclient eth0 automatically every boot
    java regex
    HTTPCLIENT 解决乱码方案 linfeng_0212的日志 网易博客
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/7881463.html
Copyright © 2011-2022 走看看