const int a = 10;
const修饰的全局变量为只读,其值不可修改。如果在程序中企图对const修饰的变量进行修改,那么程序就会报错。
static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
应尽可能少的使用全局变量,可以适当的多用const。如果修饰的全局变量只在一个文件中使用,那么const的作用和前面所说的函数局部变量没有什么区别。
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
const和static修饰的全局变量如果要在多个文件之间共享,则可以在其他文件需要时使用extern关键字,声明外部变量,使用时一定包含所定义变量所在的文件:
//file.h
const int a = 10;
static int b = 100;
//file2
#include “file.h”
extern const int a;
extern int b;//不需加static关键字
无论对于const修饰的变量a还是static变量b,这样做的结果是,整个工程的程序链接完成后,所有需要使用该变量的程序共享同一个这个变量的存储区域。
const修饰类成员变量与修饰局部或全局变量类似,其在使用时不能被修改,因此必须在对象实例化时初始化,(利用构造函数初始化列表)。
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;静态成员变量必须在类外定义,定义时不添加static关键字,但需要添加作用域限定符声明.
面试题:实现一个类,计算中程序中创建出了多少个类对象。(利用static修饰类成员变量计数)
class A
{
public:
A()
{
++_scount;
}
A(const A& t)
{
++_scount;
}
static int GetACount()
{
return _scount;
}
private:
static int _scount;
};
int A::_scount = 0;
void TestA()
{
cout<<A::GetACount()<<endl;
A a1, a2;
A a3(a1);
cout<<A::GetACount()<<endl;
}
本质上来说,static修饰的类变量并不存储在具体的对象当中,因此在计算大小时不计入;其存储在静态存储区中,不因某一对象生命周期的结束而结束,且可以被任意对象随意更改其值,因此使用时应考虑周到避免出现错用。
将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。但也可在某些变量前加上mutable关键字,其在对对象进行操作的过程中可以被修改。
用static修饰的成员函数,称之为静态成员函数。特性如下:
由以上特性,我们可以知道:
静态成员函数内部不能调用非静态成员函数(没有隐含的this指针);但非静态成员函数可以调用类的静态成员函数。
const修饰类对象,对象中的变量均不可被修改,其只能调用const成员函数。非const对象既可以调用普通成员函数也可以调用const成员函数。由于有时需要创建const对象,因此在定义类时往往要将const函数与普通成员函数一并给出。
static不能修饰一个普通类,但是可以修饰内部类;被修饰的内部类可以被当成一个普通类来使用,不需要先实例化出一个外部类。
最后总结个人对const和static的理解。
const的好处,是引入了常量的概念,让我们不要去修改某一块不该修改的内存,使某一值被保护起来避免出现错误,在编码过程中考虑const是良好的习惯,无论是常量的定义还是类中的const函数。
static我认为最大的用处在于共享。static设置了函数或变量的存储方式:存储在静态存储区域。它使得局部变量和类成员变量的生命周期变长了(因为其存储方式的特殊性)。它使类成员函数更像是一份各个对象共享的代码,使类成员变量也能在各个对象之间共享,它虽然不属于类中的成员,却能被同一类的各个对象为之所用。