const是C++中一个让人非常容易误解的特行。
它最简单的用法是被它修饰的变量被称为常量,一旦被初始化后就不能再被修改。但,有时const又是非常复杂,甚至让很多的程序员感到“可拍”。
const的简单用法
最简单的用法是声明一个常量,这是在C/C++出现之前就有的一个编程语言的特性。
声明常量只需要在变量前添加const修饰符即可,但是在声明的同时要进行初始化,因为常量是不能被修改的。
const int a = 10; //声明a为常量,其值为10,不可被修改
将那些在程序编译后就不在改变的量设为常量是非常有用的。相对于C中的#define
预处理指令,const更易于理解,并且不像#define
是在编译器处理之前对源代码进行文本处理,const是被编译器所支持的,因此在遇到错误时可以得到更多的有用信息。
const也是可以修饰指针的,这时候就要小心了,要注意const修饰的是指针本身,还是修饰指针所指向的值。
const int *a;
int const *a;
上面声明了一个指针变量a,指向一个整型常量(也就是不能通过指针a修改其指向的值,因为它指向的是一个常量,但是可以改变a的指向)。
int *const a;
这里声明的a是一个常量指针,指向一个整型变量(可以通过指针a修改其指向整型的值,但是不能将指针重新指向其他的变量)。
int const * const a;
a是一个常量指针,指向一个整型常量。
const是左结合的,也就是会修饰它左边,当它左边没有没有可修饰的时候它修饰就是它右边的。
const修饰函数的返回值
当一个指针或者引用指向的是一个常量时这在某些情形下是非常有用的,特别函数是作为函数的返回类型时是很有作用的。既可以享受到指针或者引用传值的便利性又不用担心通过指针或者引用修改具体的值。
例如
char* f(){
return "some text";
}
假如没有const的修饰,可以又下面的代码
f()[0] = 'h';
这在某些情况下可能导致程序出现错误,但是如果使用了const修饰
const char* f(){
}
在通过返回的指针修改其指向的值就会到的编译错误,可以避免上述情况的发生。
const修饰函数的参数
在C/C++中,通过值传递的只是实参的一个copy,在函数中做的任何修改都不会影响到实参。通过指针或者引用传递的参数却可以在函数中修改其具体的值,但是这又引发了一个问题,有些值使用指针或者引用传递的消耗比较低(例如,结构体或者类作为函数参数时,使用指针或者引用传递就省掉了copy的过程)所以要使用指针或者引用来传递参数,但是却不希望在函数体内通过指针(或者引用)修改传递过去的值,这时候就可以使用const修饰参数。
void f(const string& str){
}
const修饰类成员
使用const可以修饰类的成员变量,const类型的成员变量已经初始化就不能再被修改,并且要将其放在初始化列表中初始化。
cosnt也可以修饰类的成员方法,经过其修改的方法不能改变类的状态。
class c1{
int m;
void f() const;
}
void c1::f()const {
m += 1;
}
上述代码会出现编译错误,因为const方法修改类中的成员变量。
结束语
公司实习有2个周了,感觉收获确实确实很大,平常的理论学习应用到实际中还是有很大的不同。