一、全局变量和局部变量的区别
(1)、生命周期
(2)、存储区不同。前者在全局数据区,后者在堆栈区;
(3)、作用域
(4)初始化时,全局变量被初始化为0,后者是随机数;
二、静态成员(函数、变量)和非静态函数(变量)的区别
(1)共享性:静态成员是类的一部分,被类的所有的对象实例所共享;非静态数据成员,类的每个实例都有一份拷贝。
(2)内存分配:静态成员是类的静态成员(数据成员和函数成员)为类本身所有,在类加载的时候就会分配内存(静态区);非静态成员(数据成员和函数成员)属于类的实例所有,所以只有在创建类的实例的时候才会分配内存(动态区)。
(3)访问方式:静态数据成员是类的一部分,在产生任何实例之前已经存在,通过类名::静态成员变量名访问。非静态的函数由类对象(加.或this指针加->;)调用,这时将向函数传递this指针.而静态函数由类名(::)(或对象名.)调用,但静态函数不传递this指针,不识别对象个体,所以通常用来对类的静态数据成员操作。静态成员函数无法访问访问非静态成员的变量,只能访问静态成员;非静态太
(4)C++中,静态成员函数不能被声明为virtual函数同样地,静态成员函数也不能被声明为const和volatile.
(5)初始化的方式。
原因:1. static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。
2. 静态与非静态成员函数之间有一个主要的区别。那就是静态成员函数没有this指针。
虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.
对于静态成员函数,它没有this指针,所以无法访问vptr. 这就是为何static函数不能为virtual.
虚函数的调用关系:this -> vptr -> vtable ->virtual function
3.为何static成员函数不能为const函数
当声明一个非静态成员函数为const时,对this指针会有影响。对于一个Test类中的const修饰的成员函数,this指针相当于Test const , 而对于非const成员函数,this指针相当于Test .
而static成员函数没有this指针,所以使用const来修饰static成员函数没有任何意义。
volatile的道理也是如此。