1. const常量声明形式
const 数据类型说明符 常量名 = 常量值; 或者
数据类型说明符 const 常量名 = 常量值
如 const int a = 100
优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
2. 符号常量在声明时必须赋初值,而在程序中间不能改变其值。
3. const修饰类的数据成员
多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。 const数据成员的初始化只能在类的构造函数的初始化表中进行。
4. 指向常量的指针
数据类型说明符 const *指针变量 = &a;或者
const 数据类型说明符 *指针变量 = &a;
如 const int a = 10; const int *p = &a;
(1)不能通过*p来改变指向变量的值,因为指向的是常量,而常量的值是不允许改变,但是p可以改变指向,即指向该数据类型的其他变量,如p=&b,b是另外一个变量;
(2)虽然p被定义为指向常量的指针变量,但是给p的赋值可以是非const变量,即前面的a和b可以是一般的变量;
5.指针常量
数据类型说明符 * const 指针变量 = &a; 如int a = 100; int *const p = &a
(1)首先肯定p是指针变量,且p是常量,因此在声明p时必须初始化,且以后都不允许改变p的指向;
(2)p的初始化值是非const变量的地址,因此可以通过*p来改变a的值;
(3)不能用const常量的地址来初始化p的值,因为此时可以通过*p来改变指向变量的值,而常量的值在程序中是不允许改变的;
6. 指向常量的常指针
const 数据类型 * const 指针变量 = &a; 如const int a = 100; const int *const p = &a;
此时p *p a的值都不允许改变;
7. const在函数声明中的应用
在函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。
(1)修饰参数的const,如 void fun0(const A* a ); void fun1(const A& a); 调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
[注意]:参数const通常用于参数为指针或引用的情况,且只能修饰输入参数;若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。
[总结]对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是为了提高效率。例如,将void Func(A a)改为void Func(const A &a)
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x)不应该改为void Func(const int &x)
(2)修饰返回值的const,如const A fun2( ); const A* fun3( );
这样声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
[总结] 1) 一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。2)如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
(3)类成员函数中const的使用
一般放在函数体后,形如:void fun() const;
任何不会修改数据成员的函数都因该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。
8、const对象
同一般变量的声明和定义类似:
const 类名 对象名;或 类名 const 对象名;
const对象一旦定义初始化后,其值就不在允许改变,const对象只能访问类的const成员函数,不能访问其他的成员函数。
阅读(1038) | 评论(1) | 转发(0) |