1.修饰符号常量:
#define MONTHS 12;
const int Months = 12; //推荐使用
示例中常量Months被初始化后,编译器将不再允许修改该常量的值。
相比于预处理命令优点:
(1) .明确指定数据类型。
(2) .可以将定义限制在特定函数或文件中(作用域规则)
(3) .可以用于更复杂的类型,比如vector、struct
2.修饰指针:
①指针指向常量对象(无法通过指针改变对象的值)
int age = 100;
const int *p = &age;
int const *p = &age;
在以上代码中无法通过(*p)改变age的值,但可以通过age本身进行修改。
*p++; //invalid
age++; //available
②常量指针(指针指向不允许改变,但可以改变对象的值)
int age = 3;
int weight = 62;
int* const p = &age;
std::cout<<++(*p)<<std::endl;
p = &weight; //invalid
输出为3;
3.修饰引用:
常用于函数参数传递(该函数的目的只是传递使用参数的值)
int age = 3;
int weight = 62;
int getSomeone(const int& age,const int& weight);
优点:
①使用const可以避免无意中修改数据(实参)。
②使用const能够处理const和非const实参,否则只能接受非const数据。
③使用const能够使函数正确生成并使用临时变量。
注:临时变量:
long age = 3;
long weight = 64;
void getSomeone(int& age,int& weight);
getSomeone(age,weight);
实例中getSomeone函数接收到两个long类型实参时,编译器将创建两个临时int变量初始化为3,62,并对临时变量内容进行修改,而实参age、weight则保持不变(现在C++已经禁止创建临时变量)
但在只使用传递的值的函数中,使用const能够生成临时变量处理类型不匹配,确保原始数据不被修改。