const类型修饰符号将一个对象转换为一个常量,提供一个唯一不变的常量值!
1, 如果修改常量值,编译器会报错。需要注意的是,如果常量的地址赋值给指针后,指针再去修改是否可以呢?如下:
const double minWage = 9.60;
double *ptr = &minWage;//编译器报错
一般编译器不能跟踪程序中指针在任意一点指向的对象,这需要进行数据流分析(通常由单独的优化器组件完成)。因此,允许非常量对象的指针指向一个常量对象,并判断“通过这类指针间接修改变量值”的错误,这些工作一般编译器是完成不了的。
也就是说,在c++中,我们不能定义一个指向常量的“非常量”(后面将说明)指针。
2,如果要定义一个指向常量的指针,我们必须将该指针也定义为常量类型(常量指针)如:
const double *ptr;
ptr = &minWage;
*ptr +=1.4; //编译器报错
常量指针有一些特性:不允许更改指针所指的对象值,允许指向不同的对象,常量指针可以指向常量对象和其他对象。
由于具有这些特性,常量指针通常用来作为函数的参数,从而保证函数不会修改参数。如:
int strcmp( const char *str1, const char *str2);
3,由于引用类型中涉及到常量引用类型,在这里也写点自己的理解吧。
引用在内部存放的是一个对象的地址。类似于指针,但引用不能指向不同的对象(指针可以)。特别的,const引用可以用不同类型的对象初始化(只要可以从一种类型转换到另一种类型),也可以是不可寻址的值,如文字常来能够。如下:
double dval = 3.14159;
const int &ir = 1024;
const int &ir2 = dval;
如果我们将同样的初始化作用于非常量引用,编译器会报错!(这是常量引用的特殊性质)这是由于引用在内部存放的是对象地址,而对于那些不可寻址的值(如文字常量),编译器会生成一个临时对象,引用实际指向的是那个临时对象,但用户不能访问它。
有时,我们需要声明一个指向常量的引用,其格式如下:
const int iVal = 1024;
const int &ir = iVal;
而不能用一个非常量引用指向它(如 int &ir = iVal,编译器会报错)。其原因和第1点中讲的类似。
实际的C++程序很少使用指向独立对象的引用类型引用类型主要被用作函数的形式参数,例如:
//返回访问状态,将值放入参数
bool get_next_value (int &next_value);
int ival;
while(get_next_value(ival))
.... //此时ival已经修改
今天就写到这里吧,正在看其他的。。。:)