首页 > 代码库 > Effective C++ 条款三 尽可能使用const

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; //正确
  }
<style type="text/css">.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }</style>

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就很节约空间
<style type="text/css">.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }</style>

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

  class a
  {
  public:
      void fun() const
      {
          //a = 10; 错误,不可修改非static变量
          b = 10;   //正确,可以修改static变量
      }
  protected:
  private:
      int a;
      static int b;
  };
<style type="text/css">.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }</style>

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

5、修饰指针

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

   

    int m = 10, j = 100;
    const int *p1 = &m;//const在*左边,表示修饰物,*p不可变。p可变。
    printf("%p,%d\n",p1,*p1);
    //*p1 = 100;//错误,*p1不可变,但没规定p1不可变,p1可以指向其他的变量。
    p1 = &j;
    printf("%p,%d\n",p1,*p1);
<style type="text/css">.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }</style>

image

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

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

   const int fun();

7.修饰类的成员变量

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

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

  class a
  {
  public:
 
     // const int val = 100; 错误
     // static int val1 = 100; 错误
      const int val;
      static int val1;
      const static int val2;
 
      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的特性,必须在类外初始化
<style type="text/css">.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }</style>

  

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

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

     extern const int val;