基本介绍
const是constant的简写,在编程语言中意为限定一个变量为只读
C中const
1、修饰普通变量
const int num = 100;
num = 200;
//编译器报错,无法通过编译
在上述例子中,由于修饰整型变量num为只读,所以不能对其二次赋值,编译器会报错。
在用const修饰一个变量时,应该在声明的时候就初始化一个值,否则一旦用const声明了该变量,就不能对其进行赋值。
2、修饰数组
const int arr[] = { 1, 2, 3, 4, 5 };
arr[1] = 0;
//编译器报错,无法通过编译
使用const关键字修饰一个数组后,数组内的元素就不能被修改,否则编译器会报错。
3、修饰指针
(1)、修饰*p,指针指向的内容只读,指针的指向可以更改
int arr[] = { 1, 2, 3, 4, 5 };
const int* p = arr[0];
*p = 0; //操作错误,不能更改指针指向的内容
p = &arr[4]; //操作无误,可以更改指针的指向
(2)、修饰p,指针指向的内容可以改变,指针的指向不能更改
int arr[] = { 1, 2, 3, 4, 5 };
int* const p = arr[0];
*p = 0; //操作无误,可以更改指针指向的内容
p = &arr[4]; //操作错误,不能更改指针的指向
(3)、同时修饰,指针指向的内容不可以改变,指针的指向也不能更改
int arr[] = { 1, 2, 3, 4, 5 };
const int* const p = arr[0];
*p = 0; //操作错误,不能更改指针指向的内容
p = &arr[4]; //操作错误,不能更改指针的指向
助记:
const放在解引用操作符*的左侧任意位置,限定了该指针指向的对象是只读的;const放在解引用操作符的右侧,限定了指针本身是只读的,即不可变的
4、修饰函数参数
在很多库函数的定义中,都使用到了用const修饰的参数,例如:
int printf( const char *format, … );
int scanf( const char *format, … );
而在我们自定义的函数中,对于在函数体内不进行修改的参数时,可以使用const进行修饰
#include<stdio.h>
void Print(const char *str)
{
str[0] = 'H';
printf("%s\n",str);
}
int main(void)
{
char str[] = "hello world";
Print(str);
return 0;
}
在上述例子中,我们不希望传入Print中的参数被修改,所以用const对其进行修饰,保证该变量不会因为意外而被修改。若在函数体内强行修改,则会报错
因此,在实际编程中,若在函数体内不会对参数变量进行修改,建议加上const对该变量进行修饰,使之更加安全。
5、修饰全局变量
总所周知,使用全局变量不安全,因为程序的任意一个模块都可以对该全局变量进行修改,但如果用cosnt修饰该全局变量,就可以避免这种情况的发生
具体用法:在一个文件中定义,其他文件中使用外部声明
//a.h
const int ARR[] = { 1, 2, 3, 4, 5 };
//a.c
extern const int ARR[]; //这里不能再对ARR进行赋值,后面可以直接使用
C++中const
C++中沿用C中const的用法,并在此基础上,对其进行一定的扩充
此处对cosnt修饰的类成员进行一定的说明
1、cosnt修饰成员变量
const修饰类的成员变量,表示成员常量,不能被修改,并且只能在成员函数的初始化列表中初始化
class Stu
{
...
const char* _name;
const int _age;
...
Stu(const char* name, const int age)
:_name(name)
,_age(age)
{}
...
}
2、const修饰成员函数
const修饰类的成员函数,实际修改该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改
class Stu
{
...
void displayStu()const //<-->void displayStu(const Stu* this)
{
cout << _name << " " << _age << endl;
}
//等价于
//void displayStu(const Stu* this)
//{
// cout << this->_name << " " << this->_age << endl;
//}
...
}
3、const修饰对象 / 对象指针 / 对象引用
const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样
…
若要了解具体const的总结,参见eric_jo----关于C++ const的全面总结