现在的位置: 首页 > 综合 > 正文

const修饰符

2013年08月17日 ⁄ 综合 ⁄ 共 1181字 ⁄ 字号 评论关闭
 C++   语言可以用const来定义常量,也可以用   #define来定义常量。但是前者比后者有更多的优点:  
  (1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。  
  (2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。  
   
  看到const关键字,C++程序员首先想到的可能是const常量。这可不是良好的条件反射。如果只知道用const定义常量,那么相当于把火药仅用于制作鞭炮。const更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。  
  const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++程序设计书籍建议:“Use   const   whenever   you   need”。  
   
  如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。  
  const只能修饰输入参数:    
  u 如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。  
  例如StringCopy函数:  
  void   StringCopy(char   *strDestination,   const   char   *strSource);  
  其中strSource是输入参数,strDestination是输出参数。给strSource加上const修饰后,如果函数体内的语句试图改动strSource的内容,编译器将指出错误。  
   
  u 如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰。  
  例如不要将函数void   Func1(int   x)   写成void   Func1(const   int   x)。同理不要将函数void   Func2(A   a)   写成void   Func2(const   A   a)。其中A为用户自定义的数据类型。  
   
  u 对于非内部数据类型的参数而言,象void   Func(A   a)   这样声明的函数注定效率比较底。因为函数体内将产生A类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。  
  为了提高效率,可以将函数声明改为void   Func(A   &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void   Func(A   &a)   存在一个缺点:“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void   Func(const   A   &a)。   
 

抱歉!评论已关闭.