const关键字
1、与C中宏定义#define的区别
两者用来说明符号常量;
不同点:宏定义不是真正的符号常量,它没有类型,不占用存储空间,只在程序中将宏定义符号替换为对应的值;const修饰的常量有类型,占用存储空间,可以用指针指向这个值,但不能被修改。
2、修饰函数形参
若有函数typef_name(const int x);
则参数x在函数中就只能被使用,而不能被修改
3、const修饰指针变量
组合情况复杂,分为三种:
(1)指向常量的指针: const 类型名 * 变量名,如const int* p,可不初始化;
指向常量的指针使指向的对象相对该指针而言为常量,指针本身不是常量;即该指针可以更换指向的对象,但是不可修改所指向的对象的值,如
int a=1,c=2;
const int * p; //指向常量的指针
p=&a; //合法
*p=10; //非法,不可修改指向的对象的值
p=&c; //合法,可更换指向的对象
//结论,指向常量的指针可指向非常量的变量,但是不可修改其值;
//又如
const char* p = "acbf";
p[2] = 'r'; //错误,不可修改它指向的对象
p = "abcfg"; //正确,可变更指向的对象
(2)常指针 :类型名* const 变量名,如 int* const p,必须初始化;
指针本身是常量,通过该指针可以修改它指向的变量,但它不可指向其它对象,如
int a=0,b=2;
int *const p=&a; //必须初始化
*p=10; //合法
p=&b; //错误,不可指向别的对象
//字符串
char *const p="jkagjkgklj"; //初始化
p[4]='h'; //合法,可修改指向的对象
p="sdfggdxcf"; //错误,不可指向别的对象
(3)指向常量的常指针:const 类型名* const 变量名,如 const int* const p,必须初始化;
指针为常量,指向的变量相对指针来说也是常量,即两者都是常量,如
int a=0,b=9;
const int* const p=&a; //初始化
p=&b; //错误,不可更改指向的对象,此时体现的是常指针的性质
*p=10; //错误,不可修改指向的值,此时体现的是指向常量的指针的性质
//字符串
const char* const p="sdgggasgwe"; //初始化
p="adgdgfdhfhs"; //错误,不可更改指向的对象,此时体现的是常指针的性质
p[5]=k; //错误,不可修改指向的值,此时体现的是指向常量的指针的性质
PS:一般地,当声明中出现const描述符时,它修饰的是紧跟身后的声明元或在const成员函数声明中函数的this指针。
注意,可以将变量的地址赋给指向常量的指针,不会产生什么害处,但是,常量的地址不能赋给无约束的指针(常指针可修改其指向的对象,普通指针可修改指向的对象,故不可将常量的地址赋给常指针与普通指针)。如
int a=9;
const int c=7;
const int p1=&c; //引用,常量间互相引用合法,因为不会产生修改对象的操作
const int p2=&a; //常量引用变量,合法,因为不会对引用的对象产生修改操作
int* p3=&c; //非法,c为常量,不可修改,p3为普通指针,可修改其指向的对象
int* const p4=&c; //非法,p4为常指针,可修改其指向的对象
const int* const p5=&c;
本文来源于书籍:《C++语言教程(第三版)》第二章2.6
4.const修饰类的成员函数
将const修饰的类成员函数称之为const成员函数。const修饰类成员函数,实际修饰该成员函数隐含的 this 指针,表明在该成员函数中不能对类的任何成员进行修改。
普通类型的成员函数 | const 类型的成员函数 | |
普通对象 | 可以调用 | 可以调用 |
const 对象 | 不可以调用 | 可以调用 |
普通类型的成员函数 | 可以调用 | 可以调用 |
const 类型的成员函数 | 不可以调用 | 可以调用 |