前言
回顾C++所学,做总结,希望能对大家有所帮助
目录
const修饰普通变量
const修饰普通变量后,该变量不可变
const int var = 10;
const char* = "Hello world";
const修饰的全局变量链接性为内部,就像全局变量添加了static一样,因此可以把常量写在头文件中,每个包含该头文件的文件都会有各自的常量
应在声明const常量时就对其进行初始化,常量只能被初始化,不能被赋值
尽量用const替换#define (Effective C++条款2)
定义c风格的字符串常量时应用const char* const,指针和内容都应该为常量
const与#define区别
1)处理阶段不同:
#define是在预编译阶段,#define常量从未被编译器看见,因为在预处理截断就已经替换了;
const常量在编译阶段使用。
2)类型和安全检查不同
#define没有类型,不做任何检查,仅仅是字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误
const常量有明确的类型,在编译阶段会进行类型检查;
3)存储方式不同
#define是字符替换,不涉及内存;
编译器通常不会为const常量分配空间,只是将它们保存在符号表内,使他们成为一个编译期间的一个常量,没有读取内存的操作,效率也很高;
const修饰指针
分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer)
const char* p = "hello world"; //指针所指内容为常量,不能修改内容,即常量指针
char* const p = "hello world"; //指针为常量,不能修改指向,即指针常量
const char* const p = "hello world"; //指针和内容都为常量
const在*前,表明所指内容是常量,不能修改内容
const在*后,表明指针是常量,不能修改指向
使用常量指针作函数参数,既避免了拷贝,又避免了函数对值的修改,当不想传入参数时可以nullptr作缺省
const修饰引用
指向常量的引用(reference to const),const引用不能通过该引用修改所引用的对象
非const的变量可以被reference to const引用,const变量不能被非const reference引用
使用引用做参数时,如果不希望原数据被修改,应该添加const,既避免了拷贝,又避免了函数对值的修改
//一个参数为reference to const的函数
//可以传int, const int, int&, const int&
//实际上是用传入的参数对var进行了初始化,以上类型都可以对const int&进行初始化
void func(const int& var){
}
int main()
{
int var0 = 10; //普通变量
const int var1 = 10; //const
int& ref0 = var0; //普通引用
const int& ref1 = var0; //const引用普通变量
const int& ref2 = var1; //const引用常量
func(var0);
func(var1);
func(ref0);
func(ref1);
func(ref2);
return 0;
}
const修饰类成员变量
const修饰的成员变量不能被修改
const修饰的非static成员变量,可以进行类内初始化,也可以在初始化列表里进行初始化,常量没有赋值的概念,赋值也不是初始化,初始化时,开辟内存和赋初值是同时完成的
const修饰的static成员可以在在类内声明,然后在类的实现文件内初始化
class ClassName
{
private:
const int m_var0 = 10; //类内初始化
const char* const m_cstr = "hello world"; //类内初始化
const int m_var1;
const static double m_var2;
public:
ClassName(int var1) :
m_var1(var1) //初始化列表
{
};
};
const double ClassName::m_var2 = 10.0; //位于实现文件内
const修饰类成员函数
const成员函数表示该成员函数不能修改类对象中成员变量
两个成员函数如果仅常量性不同,可以被重载
应该坚持逻辑上的const. 比如修改指针常量所指向的内容,虽然没有改指针,但却修改了内容;返回自身的属性时返回了引用,虽然没有修改却使得属性可以被修改.应该避免在const成员函数中做这样的事.
当非const成员函数可以复用const成员函数,但不要在const成员函数复用非const成员函数
const实例只能调用const成员函数
class ClassName
{
public:
ClassName();
void func(); //普通成员函数
void func() const; //const成员函数
};
const修饰返回值
一个类的成员函数返回类中的某个属性,但又不希望用户修改该属性时,使用const引用作为返回值,其它情况下很少用const修饰返回值
例:操作符重载返回数据
const int& operator[](int) const;
const_cast类型转换消除const
const_cast能够消除对象的const限定
mutable突破const限制
被mutable修饰的变量,将永远处于可变的状态,不受const限制
mutable只能修饰非静态数据成员
在一个const函数中,mutable修饰的变量可被修改
结构体变量或者类对象为const,mutable修饰的变量可被修改