- 修饰变量
- 该变量不可以被改变(起保护作用,增加程序健壮性)。可以在类成员函数出声明,在构造处赋值。
- 定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式。
- 其他情况下它只是一个 const 限定的变量,不要将与常量混淆。
- 修饰指针
- 指向常量的指针 const int *ptr;
- 对于指向常量的指针,不能通过指针来修改对象的值。
- 不能使用void指针保存const对象的地址,必须使用const void类型的指针保存const对象的地址。
- 允许把非const对象的地址赋值给const对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。
- 指针常量 char * const a;
- const指针必须进行初始化,且const指针的值不能修改。
- 指向常量的常指针
- const int p = 3; const int * const ptr = &p; //ptr是一个const指针,然后指向了一个int 类型的const对象。
- 指向常量的指针 const int *ptr;
- 修饰函数
- 函数参数
- int add(int num) const; 成员函数内不能修改成员变量,成员函数是一个“只读操作”
- void function1(const int Var); // 传递过来的参数不可变
- void function2(const char* Var); // 参数指针所指内容为常量
- void function3(char* const Var); // 参数指针为常指针 指针本身不可变
- void function4(const int& Var); // 引用参数在函数内为常量
- 对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void func(A a) 改为void func(const A &a)。
- 对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void func(int x) 不应该改为void func(const int &x)。
- Q:如果函数需要传入一个指针,是否需要为该指针加上const,把const加在指针不同的位置有什么区别?
- 函数返回值
- const int function5(); // 本身无意义,因为参数返回本身就是赋值给其他的变量
- const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6(); 指针指向的内容不变。
- int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7(); 指针本身不可变
- 方法重载
- int count() {} //理解为 int count(AA *);
- int count() const {} //理解为 int count(const AA*); 1 和 2 为方法重载
- 不只是参数类型和个数不同会产生重载,const修饰的参数也会有重载。但是只有当const修饰的是指针或者引用类型时才可以,普通的int和const int会编译失败
- int count(const int& s); int count(int& s);
- 函数参数
- 修饰引用
- 经常用于形参类型,即避免了拷贝,又避免了函数对值的修改;
- 修饰对象
- const A a; 常对象,只能调用常成员函数、更新常成员变量
const常量与#define宏定义常量的区别:
- const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查
- const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数。
- const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
- const和文件域
- 非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern
参考资料:https://github.com/Light-City/CPlusPlusThings