C++中的const关键字的用法非常灵活,可以极大改善程序的健壮性,故此总结一下该关键字的主要用法。
1. 用于定义常量:
const int var = 1;
int const var = 1;
用途:var的值是不可改变的。
2. 用于定义常量指针:
int a = 1;
int* const var = &a;
//var++; error
*var = 2;
用途:指针本身是一个常量,不可对其操作,如var++,但其指向的内容是可以改变的。
3. 用于定义指向常量的指针:
int a = 1;
const int* var = &a;
//*var = 2; error
var++;
用途:指针所指向的内容是常量,不可对其操作,如*var = 2,但指针本身不是常量,可以对指针本身进行操作。
4. 用于指向常量的常量指针:
int a = 1;
const int* const var = &a;
//var++; error
//*var = 2; error
用途:指针本身是个常量,且是一个指向常量的指针,指针本身不可操作,且指向的内容也是不可操作。
5. 修饰类的成员函数:
class A {
public:
A():x(0) {}
void get() const {x = 1;}//error
private:
int x;
};
6. 类对象的操作:
class A {
public:
A():x(0) {}
void get() const {int a = x;}
void set() {x = 1;}
private:
int x;
};
int main(int argc, char *argv[]) {
const A* a = new A;
a->get();
//a->set(); error
delete const_cast<A*>(a);
a = 0;
return 0;
}
常量指针的对象只能调用被常量修饰的成员函数,但普通的对象也能调用被常量修饰的函数。
7. const与非const的转换:
因为不能把const的变量直接赋给一个非const变量,所以需要进行转换。
int main(int argc, char *argv[]) {
int i = 0;
const int* a = &i;
//*a = 1; error
int* j = const_cast<int*>(a);
*j = 1;
return 0;
}
把一个非const变量转换成一个const变量
int main(int argc, char *argv[]) {
int i = 0;
int* a = &i;
const int* j = const_cast<const int*>(a);
//*j = 1; error
return 0;
}
注:const_cast只能用于转换指针变量,普通变量不能使用const_cast转换(类也一样)
int main(int argc, char *argv[]) {
const int i = 0;
//int j = const_cast<int>(i); error
return 0;
}
8. const比define的区别:
define是在预处理阶段处理。
const是在编译阶段处理。
define没有类型,只是一个标示符,不做任何安全的类型检查
const具有具体的数据类型,在编译时会做类型的安全检查。
define在预处理阶段时,有多少个地方使用,边有多少个该定义被拷贝,不会分配内存,只是替换。
const会分配内存。
9. const的优势:
具有安全类型检查;具有具体的数据类型,可以进行代码跟踪,方便调试