- static关键字相关内容
static的作用: 控制变量的存储方式和可见性
- 修饰局部变量:一般情况下,局部变量会存储在栈区。并且在包含语句块结束后生命周期就结束了。加入static修饰后,存储在静态数据区,生命周期会延长到整个程序结束。但作用域不改变。
- 修饰全局变量:对于一个全局变量,它可以在本文件内被访问,也可以被同一个工程下的其他文件访问(添加extern声明即可)但加入static修饰后,就只能本文件访问,即作用域变了。
- 修饰函数:作用效果同上
- 修饰类:对类中的某个函数用static修饰,则表示这个函数属于一个类而不再是这个类中的对象。修饰类中的某个变量,则表示该变量在存储空间内只有一个副本,可以通过类和对象来调用。
- 修饰的类成员属于类,而不是对象。static成员函数不属于任何对象或实例,因此没有this指针。(即不能实例化)而虚函数的实现是要为每个对象分配一个vptr指针,vptr指针要靠this来调用。所以static成员函数不能用virtual来修饰。虚函数的调用过程:this->vptr->ctable->virtual function
- const关键字相关内容
- 修饰基本数据类型:以int为例,const int和int const的效果是相同的。只要不改变变量的值就可以。
- 修饰指针或引用:const *表示修饰的是指针指向的变量,指向的变量为常量,* const表示指针为常量。
- 修饰类中成员变量:只是在某一个对象的生命周期内是常量,而对于整个类不是,实在想要建立在整个类中都恒定的常量,应该用类中的枚举常量来实现或者是static const
- 修饰类中成员函数:主要目的是为了防止成员函数修改对象的内容。实在想修改,使用mutable来修饰。对成员函数来说static和const不能同时使用。
修饰类对象:定义常量对象,常量对象只能调用常量函数。非常量对象既可以调用常量函数也可以调用非常量函数。(原因:对象调用成员函数时,在形参列表前加一个隐式的this,this指针默认指向调用函数的当前对象的,因此是一个常量指针。但当调用的是常量函数时,this指针前多了一个const,因此是不可以通过this指针改变指向对象的值。)