c/c++中的const是个好东西,但是东西往往杂糅不堪,对于这个c/c++知识中的冰山一角,决定给它来一次全面体检,当然我这个不称职的doctor只能做部分体检项目。权且当作自己的笔记吧。
1。const 和常用变量
这里说的常用变量,其实指的就是c++中的内置类型。
例如定义:const int a =100;
int const a=100;
上述两个语句功能一样,就是a这个int变量被永远赋值为100的int常量了,不可修改,在这点上其实可以觉得const和define有相似之功能,但是const相比与define来说是有优点的,优点包括:const有类型检查,而define则都认为是字符,没有类型检查;有些集成的调试工具可以对const常量进行调试,而不能对宏常量进行调试。
2。const和指针
const和指针的关系就复杂了,基本呈网状结构,这里只是理顺一部分,不敢说全部理顺。
基本规则:const在*的前面,那么这个指针指向的是个常量,即无法通过指针对其修改,可以称为常量指针;const在*的后面,即该指针本身不能被修改了,比如对指针本身进行+-,可以称为指针常量。
eg: const int *p=&a;//ok
int *m=&a;//error,只能用常量指针指向常量
int c=0;
const int *m=&c;//ok,可以用常量指针指向常量,但是不能通过指针m修改c的值了
const int *const ptr=&a;//ok,这里ptr指向一个常量,同时该指针本身不能被修改,这类指针是指向const对象的const指针,该句可以翻译为:首先ptr是个const指针,指向int类型的const对象。
3。const和函数
在这里把函数分为了普通函数和类里面的成员函数,对于普通函数和成员函数,const均可修饰里面的parameter的属性。在一个函数声明式内,const可以和函数返回值,各个参数,函数自身(如果是成员函数)产生关联。
1)const与修饰函数参数
例如:
void f1(const Widget * pw)// f1获得一个指针,这个指针指向一个常量的Widget对象
在函数中无法对const的参数进行修改
2)const修饰函数,位于函数声明最前面
const有一个作用就是避免意外的将==输入变成了=。因为在函数声明最前面加上const之后,表示返回的东西是个常量,是不能被修改的,赋值当然是不行的,从而有效避免了将==错误写成=。
3)c++中,const修饰在成员函数的参数列表之后
const成员函数
带来的基本好处有二:(1)是class接口更容易理解。指明了那些函数可以修改对象内容那些则不能。
(2)使得 操作cosnt对象成为可能
对于const成员函数,是在参数列表后的)后面加上const,接着是{。。。}。表示在这个成员函数里面是不会对对象的成员进行修改的。两个函数能够通过const进行区分,而不是覆盖。
const对象能够调用const成员函数,而非const对象则不能用const成员函数处理。const成员函数不可以更改对象内任何non-const成员变量(这个可以叫做non-static成员变量的bitwise constness约束)。当我们在const成员函数中希望修改某些成员变量时候,可以在定义该变量的时候在其前面加上mutable,就可以释放掉bitwise constness约束,从而能在const成员函数中对其进行修改。
那么想在非cosnt成员函数中想对某些成员变量进行约束,从而使得在该成员函数中之后的代码不能修改该成员变量的值,那么该怎么办呢~可以进行类型转,static_cast<const 类型>(*this),就可以做到了。
另外,const对象只能调用const成员函数,因为非const成员函数可能会修改对象的某些成员变量。const成员函数如果想修改对象中的成员变量的话,可以在该成员变量的声明加关键字mutable,例如mutabe int count,这样count就能被const成员函数修改了。