• c++ const 用法


    1.  修饰一般变量,const int a = 10;  表示此变量不能被修改,简单易懂,不多说

    2.  修饰指针,主要是下面三种

         const int *cp1 = &a;       //修饰int,不能修改指针指向的内存的值,即a的值

         int const *cp2 = &a;      //同上

         int *const cp3 = &a;      //修饰*, 指针本身不能修改,即不能改变指针指向a还是b

        助记:看const左边第一位,是什么类型就是修饰什么,左边没有找右边第一个

      int a = 10;
      int b = 20;
      std::cout << "a = " << a << std::endl;
      std::cout << "b = " << b << std::endl;
       
      //1
      const int *cp1 = &a;
      std::cout << "*cp1 = " << *cp1 << std::endl;
      cp1 = &b;     //        可以修改指针本身,即指向a还是b可以改
      //*cp1 = 1111;  //error, 修饰int,不能修改指针指向的内存的值,即a的值
      std::cout << "after cp1=&b,*cp1 = " << *cp1 << std::endl;
    
      //2  the same as 1
      int const *cp2 = &a;
       std::cout << "*cp2 = " << *cp2 << std::endl;
      cp2 = &b;
      //*cp2 = 2222;  //error
      std::cout << "*after cp2=&b,*cp2 = " << *cp2 << std::endl;
    
      //3
      int *const cp3 = &a;
      std::cout << "*cp3 = " << *cp3 << std::endl;
      //cp3 = &b;    //error,   修饰*, 指针本身不能修改,即不能改变指向a还是b
      *cp3 = 3333;  //       可以修改指针指向的内存的值,即a的值
      std::cout << "after*cp3=3333,*cp3 = " << *cp3 << std::endl;
    
      std::cout << "a = " << a << std::endl;
      std::cout << "b = " << b << std::endl;

    3.  修饰类成员函数

         const int setValue(const int value) const

         从左到右,1. 返回值不能改

                           2. 参数不能改

                           3. 常函数,函数成员变量不能被修改,如需要更改,请在成员变量前加上mutable

    class A
    {
    public:
      A():m_a(0) ,m_b(0){}
      virtual ~A(){}
     
    public:
      const int geta(){return m_a;}  //返回值不能被修改
      int setValue(const int value) const
      {
          //m_a = value; //error 函数后面有const,常函数,不能修改成员变量 
          m_b = value;   //      如果要修改,需要加上mutable修饰成员变量
          //value++;     //error const 修饰函数参数,不能被修改
          return value;
      }

    private: int m_a; mutable int m_b; };

    个人总结:

         实际应用中,一般用const来修饰自定义的复杂的数据结构或者类的指针或者引用,用以进行函数传参或者返回,避免传参时进行数据拷贝或者生成临时对象,影响程序性能,也常建议这么处理,尽量使用const 指针或者引用来处理传参, 尽量最大程度的获得编译器的优化。

          对于一般的基础类型变量本身就是进行值传递时,意义不大。

  • 相关阅读:
    FFMPEG音视频基础问题和被面试问到的东西
    OpenGL学习
    FFMPEG起航之旅
    SurfaceView、TextureView对比和学习
    对文件拷贝、删除操作、对时间的计算以及转化
    音视频开发
    企业级Android应用架构设计与开发
    屏幕分辨率的适配&&开发文档的介绍
    设计模式的学习
    自定义Dialog的模版
  • 原文地址:https://www.cnblogs.com/leehm/p/10972970.html
Copyright © 2020-2023  润新知