const、引用初探

  当我们声明一个常量:const double minWage = 9.60;我们是否可以这样 double *ptr = &minWage;答案显然是不可能的,因为prt是一个普通指针,没有什么能够阻止我们写这样的代码:*prt += 1.40;//修改了minWage! 这样就间接的修改了minWage的值。

  我们必须声明一个指向常量的指针来做这件事:const double *cptr; //cptr是一个指向double 类型的const指针,即:cptr是一个指向double类型的、被定义成const的对象指针。

  但其中的微妙在于cptr本身不是常量,我们可以重新赋值cptr,使其指向不同的对象,但不能修改cptr指向的值 。

例如:const double *pc = 0;

     const double minWage = 9.60;

    pc = &minWage; //ok

    *pc  = 3.14; //error

  const对象的地址只能赋值给指向const 对象的指针,例如pc。但是指向const对象的指针可以被赋以一个非const对象的地址,例如:int dval = 10; cont int *pc = &dval;虽然dval不是常量,但试图通过pc修改它的值,仍会导致编译错误。

  在实际的程序中,指向const的指针常被用作函数的形式参数。这样能保证被传递给函数的实际对象在函数中不会被修改。例如:int strcmp(const char *str1,const char *str2);

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

引用类型:

  引用类型在声明的时候必须初始化,例如 int  a = 10;  int &b = a ;//ok   int &c ; //error

  引用一旦被初始化就不能再指向其他的对象了。

  const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是文字常量。例如:

  double dval = 3.14;

  //仅对于const引用才是合法的

  const int &ir = 1024;

  const int &ir = dval;

  const double &dr = dval + 1.0;

  同样的初始化对于非const引用是不合法的,将导致编译错误。引用在内部存放的是一个对象的地址,它是该对象的别名。对于文字常量,以及不同类型的对象,编译器为实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问。例如,我们编写这样的语句:double dval = 1024;

  const int &ri = dval;

编译器将其转换成:int temp = dval;

         const int &ri = temp;

如果我们给ri赋一个新值,则这样做不会改变dval,而是改变temp。但对用户来说,就好像修改动作没有生效。

posted on 2012-09-15 12:43  z-road  阅读(208)  评论(0)    收藏  举报