关键字const详解~
const在C语言中的关键字,其应用比较广泛,我们在C++、Pascal、PHP5之中也经常见到,今天就const的常用方法以及含义进行解释。
const的作用:
1、const修饰的变量称为常变量,其是变量,但是具有常属性,即变量或对象的值是不能被更新的。使用const在一定程度上可以提高程序的安全性和可靠性。
2、可以保护被修饰的对象或变量。const可以保护那些不希望被修改的对象,防止意外的修改或者无意义代码的出现。
3、const修饰常量与宏常量类似,故其可以非常方便的进行参数的调整,提高程序的效率。
4、const常量可以进行类型安全检查,而与之相比,宏常量只是进行了简单点的替换,并不进行类型安全检查,因此在替换的时候可能会出现意想不到的错误。
5、节省内存空间,避免内存分配,提高了程序效率。const修饰的对象或变量其通常都保存在符号表中,内存并不为其分配空间,也就不存在读取的操作,提高了效率。
const在不同的环境下进行使用,其产生的效果可能不同。其可以用来修饰变量、指针、函数。
const的使用:
1、const修饰常变量
如下图所示,两种方式都可以,其产生的效果都是令对象不再被更新。
2、const修饰指针
const修饰指针的时候分为几种情况,详见下面代码:
void test()
{
int x = 10;
int y = 20;
// 第一种情况
const int* a = &x;// const修饰的是指针所指向的内容,其不可变
*a = 30;// 错误,不允许改变指针指向的变量的值
a = &y;// 正确,允许改变指针的指向
//第二种情况
int* const b = &x;// const修饰的是指针,其不可变
b = &y;// 错误,不允许改变指针指向
*b = 30;// 正确,允许改变指针指向的变量的值
//第三种情况
const int* const c = &x;// 指针与指针所指向的内容都不可变
c = &y;// 错误,不允许改变指针指向
*c = 30;// 错误,不允许改变指针指向的变量的值
}
需要注意的是在C语言中,对于const定义的指针,不赋初值编译不报错
int* const var;//这种定义是不允许的,指针常量定义的时候对其进行初始化
int const *var;//这种定义是允许的,常指针可以再定义的时候不初始化
但是,在C++中
int* const var;//会报错
const int* const var;//会报错,
const int* var;//不报错
必须初始化指针的指向int* const var = &x;const int* const var=&x;
强烈建议在初始化时说明指针的指向,防止出现野指针!
3、函数中使用const
const在函数中,其可以用来修饰函数参数、函数返回值等,详见下面分析:
(1)void function(const int var);
此时const修饰形参,保证传递过来的参数在函数内不可以改变
(2)void function(const char* var);
此时const修饰形参指针,保证传过来的参数指针所指内容为常量,不会更新
(3)void function(const Class& var);
当参数为引用时,用const修饰可以增加效率同时防止无意的修改。
(4)const int function(…)
这个其实无意义,因为参数返回本身就是赋值。
(5)const int* function(…)
此时由于const的修饰,在调用函数时,将函数返回值看作成一个变量,其指针所指向内容不可变。
(6)int* const function(…)
在const的修饰下,在调用函数时,将函数看作成一个变量,其指针指向不可变。
注意:一般情况下,函数的返回值为某个对象时,如果用const修饰时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用。因为如果返回值为某个对象是const或某个对象的引用为const,则返回值具有const属性,则返回实例只能访问类中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。
4、const在类中的应用
(1)const修饰成员变量
const修饰类的成员函数,表示成员常量不能被修改,同时它只能在初始化列表中赋值。
class A
{
…
const int value; //成员常量不能被修改
…
A(int x)
: value(x) //只能在初始化列表中赋值
{ } ;
...
}
(2)const修饰成员函数
当const修饰类的成员函数时,则该成员函数不能修改类中任何非const的成员函数。
对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。其表现为:const成员函数不被允许修改它所在对象的任何一个数据成员,而const成员函数能够访问对象的const成员,而其他成员函数不可以。
(3)const修饰类对象/对象指针/对象引用
当const修饰类对象时,表示该类对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样的作用。
const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
结语:熟悉const的应用,在程序中运用自如,可以提高程序的鲁棒性、安全性、可靠性以及效率。因此我们要深入了解const在不同场景、不同情况下的作用。言止于此,如此文有误,还请各位指正。