C++ const用法及注意事项

来源:互联网 发布:portraiture mac 编辑:程序博客网 时间:2024/04/30 08:22

effective c++ 条款03讲到:Use  const whenever possible 由此可见const 限定符对于c++的重要性。下面尽可能全面的总结const 的用法和技巧。主要资料来源于c++ primer,标题后的页码为c++ primer 中文版(第四版)的页码。


  (一) const限定符(p49)

  • 定义const对象时要初始化
  • 除非特别说明,在全局作用域声明的const变量是定义该对象为文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问
  • 通过制定const变量为extern ,就可以在其他文件中访问const对象   (extern const int bufsize = 1)

    (二)const引用(p51)
  • const引用是指向const对象的引用,不能将非const引用绑定到const对象,但可以将const引用绑定到非const对象。const引用可以初始化为不同类型的对象或者初始化为右值。

    (三)const变量在头文件中的使用(p59)
  • 如果const变量是用常量表达式初始化的,那么就将它放在头文件中。反之,则放在源文件中。

     (四)const和指针(p110)
              1.指向const对象的指针
        
  • 指向const对象的指针必须具有const特性(const double *ptr),ptr本身不是const,在定义时不需要初始化,可以允许给ptr重新赋值,但是不能通过ptr修改其所指对象的值
  • 不能使用void *保存const对象的地址,而必须使用const void*
  • 允许把非const对象的地址赋给指向const对象的指针,但同样不能使用指针修改对象的值。

               2.const指针

        
  •           const指针必须在定义时初始化,可以通过指针修改对象的值。
              3.指向const对象的const指针
         
  •             const double pi = 3;
  •          const double *const pi_ptr = π
  •          既不能修改pt_ptr所指向对象的值,也不能修改指针的指向。
      
              4.const形参(p200)
   
  •         如果函数参数是非引用的非const形参,则既可给该函数传递const实参也可以传递非const的实参。
  •         如果函数形参定义为非引用的const类型,则既可以传递const对象也可以传递非const对象。在函数中不可以改变实参的局         部副本
               5.指向const对象的指针形参和指向非const对象的指针形参(p200)
  
  •        当函数形参为指向const对象的指针(const int *)时,可以使用指向const对象的指针(const int *)作为实参也可以使用指向非             const对象的指针(int *)既普通指针初始化形参
  •       当函数形参为指向非const对象的指针(int *) 时,则只能将指向非const对象的指针(int *)传递给函数,而不能将指向const         对象的指针传递给函数。
  (五) const引用做形参(p205)
  •         应该将不需要修改的引用形参定义为const引用。普通的非const引用形参在使用时不太灵活。这样的形参既不能使用const对象初始化,也不能使用字面值或产生右值的表达式初始化
 (六)重载和const形参(p235)
  •      可基于函数的引用形参是指向const对象还是指向非const对象,实现函数重载。将引用形参定义为const来重载函数是合法的。 
  •    Record lookup(Account&);
  •    Record lookup( const Account &); //new function

  •   注意不能基于指针本身是否为const来实现函数的重载:
  •   f(int *)
  •   f(int * const) // redeclaration
 

       
   (七)const成员函数
   
  •     const成员函数不能修改调用该函数的对象。
  •     const 对象、指向const对象的指针或引用只能用于调用其const成员函数,如果尝试用它们调用非const成员函数,则是错误的      

原创粉丝点击