全局变量和局部变量的区别/静态成员函数变量和非静态函数变量的区别

来源:互联网 发布:韧带 知乎 编辑:程序博客网 时间:2024/06/06 08:23

一、全局变量和局部变量的区别

(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的道理也是如此。 

阅读全文
0 0