_J

please call me j

导航

【c++手记】关于const的问题&资料

【问题】
     const int Func(const int & const x) const ;//error!
 
【解析】
     1.第一个const:(在函数中)修饰返回值
         声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
         (何为保护作用?如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的
所指对象不能被修改,该返回值只能被赋给加const修饰的同类型指针)

     2.第二个const:(在函数中)修饰参数
           用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化。
           如形参为const A* a,则不能对传递进来的指针的所指对象(不是指针的值)进行改变,保护了原指针所指向的内容。
           如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。

     3.第三个const:(由于可写可不写,忽略!)

     4.第四个const:(在成员函数中)用于声明成员函数
          这里是会报错的,原因在于其并非是一个成员函数!!
          一般放在函数体后,形如:void fun() const;
          任何不会修改数据成员的函数都因该声明为const类型。
          如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。
          被声明为const的成员函数,则不能为static(静态函数),原因是其成员函数必须是显示或隐式包含this指针!
 

 
【问题】
     const int max = 100;

【解析】
     const常量有数据类型,而宏常量没有数据类型。
     编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。



【问题】
     class a{
     private:
     const int max;
     }

【解析】
     const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。
     因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。
     所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。
        const数据成员的初始化只能在类的构造函数的初始化表中进行



【问题】
     1)const int *a;
     2)int const *a;
     3)int* const a;
     4)const* int const a;

【解析】
     1.const在*号左边:1)2)
         const就是用来修饰指针所指向的变量,即指针指向为常量
     2.const在*号右边:3)
         const就是修饰指针本身,即指针本身是常量
     3.第四种情况就是1+2
 

 
【资料1】
     《primer》-P49 const限定符
 
【内容1】
     1.const限定符提供了一个解决方案,将一个对象转换为常量
     2.a 全局作用域里定义非const变量时,它在整个程序中都可以访问(必要的声明头文件)!
       b 而在全局作用域声明的const变量是定义该对象的文件的局部变量,若通过指定const变量为extern,就可以在整个程序中访问const对象。
 
//------------------------------------------------------------------------
 
【资料2】
     《primer》-P51 const引用
    
 
【内容2】
     const引用是指向const对象的引用
     例如:
          const int ival = 1024;
          const int &refVal = ival;
     可以读取但不能修改refVal。即不能通过修改refVal来修改iVal.同理int &ref2 = ival 是不合法.
 
//------------------------------------------------------------------------
 
【资料3】
     《primer》-P110 指针与const限定符
 
【内容3】
     c++强制要求:指向const对象的指针必须具有const特性。即:
          const int ival =1024;
          int ival2
          const int* ivalPointer = &ival;//ok
          int* ivalPointer2 = &ival;//error
          const int* ival2Pointer = &ival2;//ok
 
//------------------------------------------------------------------------
 
【资料4】
     《primer》-P111 const指针
 
【内容4】
     例如:
          int *const curErr = &errNumb;
     读作curErr指向int型对象的const指针。
     const指针的值不能修改,故意味着curErr不能指向其他对象。
 
//------------------------------------------------------------------------
 
【资料5】
     《primer》-P112 指向const对象的const指针
 
【内容5】
     例如:
          const double *const pi_ptr = &pi//pi is a const object
     混合const指针和指向const对象的指针。即不能修改pir_ptr所指向的对象的值,也不允许重定向pir_ptr指针指向。
 
//------------------------------------------------------------------------
【资料】
  const作为成员函数修饰时&纯虚函数!
  http://www.cnblogs.com/jstone/archive/2012/08/31/2665250.html

posted on 2012-08-28 00:12  _J  阅读(168)  评论(0编辑  收藏  举报