一、const 定义符号常量
在学习c语言的时候,我们使用#define来定义符号常量。而在c艹中提供了一种更好的处理符号常量的方法。就是使用const关键字来修改变量的声明和初始化。
通过宏定义常量的方法为
#define LENGTH 1000
再看看使用const的创建常量的通常格式:
const type name = value;
使用const的优点:
①const可以定义数据类型,而宏无法明确的定义数据类型(虽然可以使用L或UL指明数据长度),但是在编译过程中难以对其进行检查,使用define更加危险。
②现在一些c艹的调试工具可以对const进行调试,而无法对define进行调试,建议使用const和inline去替代宏的作用。
二、const与指针
const和指针搅在一起咋看上去总觉得乱糟糟的,其实我们只需要记住一句话就好:
若const在星号的前面,修饰的是常量;若const在星号的后面,修饰的是指针!
比如
int b;
const int * a=&b;
int const * c=&b;
定义的是一个指向int常量的指针,也就是说你能指向别的地方,但无法改变所指向的数据的内容。
int * const d=&b;
这是定义一个指向int变量的常量指针,你能改变数据的内容,但是不能移动指针的指向。
const int * const e=&b;
像这样的傻子就是指向常量的常量指针啦╮(╯▽╰)╭
三、const与成员函数
如果有人问你const的作用是什么,千万不要仅仅回答用于定义变量,可以回答用于使所修饰的内容不可改变,提高高程序的健壮性。
比如,(假设A是一个类,func()为其一个成员函数)
const A func(A const & other) const;
第一个const修饰函数返回值,返回一个A类的常量;
第二个const修饰参数对象的引用,保证作为参数的类不会被改变;
第三个const修饰对象本身,使得对象本身不会被改变。
有个比较奇葩的特例,若是const在成员函数中,变量用mutable修饰的话,还是可以修改类的成员变量。