zoukankan      html  css  js  c++  java
  • Effective C++ 条款三 尽可能使用const

    参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结

    1.用于定义常量变量,这样这个变量在后面就不可以再被修改

        const int val = 90;

         val = 100;   错误

    2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,

    则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护

     void fun1(const int &val)
      {
          //val = 10; //错误
      }
     
      void fun2(int &val)
      {
          val = 100; //正确
      }

    注意:对于引用修饰函数的参数,定义如下,如果是内部结构数据类型,我们一般不用 & 引用,而对于非结构类型,我们一般用引用。

    3. 节约内存空间

    #define PI 3.14
     
    const double pi = 3.14; 
     
     double  a = pi;  //这时候才为Pi分配内存,不过后面再有这样的定义也不会再分配内存
     
     double  b = PI;  //编译时分配内存
     
     double  c = pi;  //不会再分配内存,
     
     double  d = PI;  //编译时再分配内存
     
    //const定义的变量,系统只为它分配一次内存,而使用#define定义的常量宏,能分配好多次,这样const就很节约空间

    4.类中使用const修饰函数防止修改非static类成员变量

      class a
      {
      public:
          void fun() const
          {
              //a = 10; 错误,不可修改非static变量
              b = 10;   //正确,可以修改static变量
          }
      protected:
      private:
          int a;
          static int b;
      };

    这一点主要是用来确定,哪个函数可以用来改动对象内容,而哪些函数不可以用来改变对象内容。

    5、修饰指针

        const int *a; int const *a; 效果一样,主要是*号与const的位置,在*左边,表示修饰物,在右边表示修饰指针。

       

        int m = 10, j = 100;
        const int *p1 = &m;//const在*左边,表示修饰物,*p不可变。p可变。
        printf("%p,%d
    ",p1,*p1);
        //*p1 = 100;//错误,*p1不可变,但没规定p1不可变,p1可以指向其他的变量。
        p1 = &j;
        printf("%p,%d
    ",p1,*p1);

    image

           在上面的程序中,我们也可以改变m的值,这是可以的。

    6.修饰函数返回值,防止返回值被改变

       const int fun();

    7.修饰类的成员变量

       这一点的话,初始化是个需要注意的地方。

        如果是const 修饰的变量,可以不可以在类里面直接初始化,而是必须在构造函数初始化列表中初始化。而static修饰的变量,必须在类外初始化。当是const与static修饰的变量,必须在类外初始化。

    
    
    
      class a
      {
      public:
     
         // const int val = 100; 错误
          const int val;
          static int val1;
          const static int val2 ; 
     
          //const static int val2 = 100; //这个不会 报错,对于常量可以在类内部初始化,也可以在类外部初始化。
          a():val(100) //const变量必须在构造函数初始化列表中进行初始化
          {
     
          }
     
          void fun() const
          {
              //a = 10; 错误,不可修改非static变量

    b = 10; //正确,可以修改static变量

    //val = 100; val是const类型,不可以被修改

          }
      protected:
      private:
          int a1;
          static int b;
      };
     
      int a::b = 100;
      int a::val1 = 100;//static变量必须在类外初始化
      const int a::val2 = 100;//const static保留了static的特性,可以在类外初始化,也可以在类内部初始化

      eg2:

    class A
    {
    public:
    const static int b = 10;
    //const int c = 11; //error
    //static int d = 12;//error
    const int c;
    static int d;
    A():c(11)
    {
    // d = 12; error
    }
    protected:
    private:
    };

     

    int A::d = 12;

    调用:

    A* aa = new A();
    cout << aa ->b <<" "<< aa->c <<" "<<aa->d << endl;

    8.const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用

         要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为

         extern const int val;

  • 相关阅读:
    根据百度API获得经纬度,然后根据经纬度在获得城市信息
    Map实现java缓存机制的简单实例
    JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储
    JMS学习(六)-ActiveMQ的高可用性实现
    排列与组合的一些定理
    带权图的最短路径算法(Dijkstra)实现
    JMS学习(六)--提高非持久订阅者的可靠性 以及 订阅恢复策略
    JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
    分布式系统理论之两阶段提交协议
    自定义栈的实现及使用两个栈模拟队列
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3914552.html
Copyright © 2011-2022 走看看