1.基本概念
常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。
2.const修饰基本数据类型
2.1const修改一般常量及数组
int const a = 100;
const int a = 100; //同上
int const arr[3] = {1, 2, 3};
const int arr[3] = {1, 2, 3}; //同上
2.2const修饰指针
char *p = "hello"; // 非const指针,
// 非const数据
const char *p = "hello"; // 非const指针,
// const数据
char * const p = "hello"; // const指针,
// 非const数据
const char * const p = "hello"; // const指针,
// const数据
2.2.1常量指针
int a = 5;
const int *p =&a;
*p = 20; //error 不可以通过修改所指向的变量的值
int b =20;
p = &b; //right 指针可以指向别的变量
2.2.2指向常量的指针
int a = 5;
int *const p = &a;
*p = 20; //right 可以修改所指向变量的值
int b = 10;
p = &b; //error 不可以指向别的变量
2.2.3总结
const位于*左侧,则指针所指的变量为常量,指针所指的对象不可修改;
const位于*右侧,则指针为常量指针,指针不可指向别的地方。
3.const修饰函数
3.1const修饰函数参数
3.1.1参数为指针
起保护作用
void StringCopy(char* strDest, const char* strSource);
实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。形参加上const 修饰之后,保护了这一块内存地址不被修改,如果刻意修改这一块内存,编译器会报错。
3.1.2参数为引用
起保护作用
void func(const int &x);
3.2const修饰函数返回值
3.2.1值传递
如果是值传递(比如返回值是int类型的),没有必要用const修饰。
int func();
const int func(); //没有必要
3.2.2返回值是指针
const修饰的函数返回值要用const修饰的变量接收。
const char* func();
char* str = func();// error
const char* str = func(); //right
3.2.3返回值是引用
用得少。
3.3const修饰成员函数
const修饰成员函数为了保护成员变量,要求const函数不能修改成员变量,否则编译会报错。
class MyClass {
public:
void func(int x) const;
};
4.const的特殊用法(类中定义变量)
// using c++11 standard
class CTest11
{
public:
static const int a = 3; // Ok in C++11
static int b = 4; // Error
const int c = 5; // Ok in C++11
int d = 6; // Ok in C++11
public:
CTest11() :c(0) { } // Ok in C++11
};
int main()
{
CTest11 testObj;
cout << testObj.a << testObj.b << testObj.c << testObj.d << endl;
return 0;
}