参考了一下另一篇博客,
- const声明的全局变量默认为该文件的局部变量仅限该文件使用,除非显式声明为
extern const int a = 1;
- const引用
int p = 42;
const int& q = p;
const int& x = 42;//不会报错
//而int & x = 42;会报错
/*const int p = 42; int &x = p;会报错,因为不能忽略限定符const给使用者造成错觉*/
/*const引用不能够修改内部地址的值*/
const double& w = p;/*必须加上const才不会报错,引用存储的会是类型转换后的临时变量*/
- const指针
const string* array = new string[100];
/*声明类的这种数组必须保证有默认构造参数,且声明之后就不能修改这个数组里的各个元素的值了*/
const int a = 4;
const int* p = &a;/*必须声明为const指针,保证不能通过指针修改常量值*/
int b = 2;
const int* p2 = &b;/*这样也可以,但是不能通过p2来改b的值了*/
int* const p3 = &b;/*这样代表的是这个指针指向的地址是固定的,可以修改存储的值,也就是*p3 = 3;合法,而p3 = &a;是不合法的*/
/*不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。*/
- 在类中const成员函数
/*在一个类中,任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说明格式如下:*/
int get_v() const;
/*既然const是定义为const函数的组成部分,那么就可以通过添加const实现函数重载咯。*/
/*const对象默认调用const成员函数。*/
- const 修饰函数返回值
规则和之前的const int* /int* const等规则相同 - const修饰函数参数
参数指针所指内容为常量不可变
- 参数引用为常量不可变
- const数据成员
class test_const {
const int a;
const static int c;
static int d;
int b;
public:
test_const(int x,int y):a(x+y),b(1) {/*非静态常量必须在构造函数初始化列表声明*/
b = 2;
}
void addAndOut(int val) {
d += val;
cout << d << endl;
}
};
/*在使用的地方的全局作用域声明静态变量*/
const int test_const::c = 1;/*必须完全const限定符匹配,所以不能去掉const*/
int test_const::d = 1;/*这里也不能加上const*/
我虽然看懂了,但我仍然大受震撼,小小一个限定符,搭配上指针、引用、类、函数、参数、返回值等出现这么多变种!