static在C++和C语言中的区别

C语言中:

  1. 静态局部变量和普通局部变量他们的主要区别是作用域不同,静态局部变量的作用域是它当前的文件,其他文件是不可以访问的。多人联合开发是不会担心变量名冲突。而普通全局变量的作用域是当前整个工程的的,不同文件可以共享全局变量。
  2. 存储的位置不同,静态局部变量被static修饰其生命周期是整个源文件,静态局部变量存储在静态存储区。因为其生命周期是全局的,所以对其初始化只会执行一次。普通的局部变量存储在数据段,未被初始化或者初始化为0存放在.bss段,初始化成功的存放在.data段
  3. 默认的初始值不同。静态局部变量默认的初始值是0,如果初始化执行一次,后面的初始化不再执行。普通的局部变量初始值是随机值,每一次合法初始化都会执行。
  4. 全局变量在前面加static后会将全局变量的作用域限制为本文件访问。
  5. 静态函数的作用域为当前的源文件,但是局部函数的作用为整个工程。静态函数一直会被放在一个一直使用的存储区,避免了调用函数时的出栈哈压栈。

C++中:

  1. 静态数据成员是属于整个类的,而不是属于某个对象,不管创建多少个对象都共同用一个静态数据成员。
  2. 静态数据成员的初始化必须在类外初始化,因为静态数据成员不属于任何一个对象,而是属于整个类的。普通数据成员在构造函数的函数体或者在初始化列表中初始化,常量数据成员必须在初始化列表初始化。
  3. 静态数据成员存储在静态存储区,而且必须初始化才可以使用,不能在类声明中初始化。因为静态数据成员的生命周期比一个具体的类实例化的对象更长一些,在类对象存在之前就已经存在了。
  4. sizeof(对象)大小不包含静态成员,函数声明也不占大小。

特性:

  1. 静态成员函数没有隐藏的this指针,一般不能访问任何非静态成员函数,普通成员函数有this指针。当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。但是静态成员函数不属于对象的成员函数,与任何对象无关,因此静态成员函数没有this指针,既然没有指向某一对象,就无法对一个对象里的非静态成员进行默认访问。
  2. 不依赖对象也可以调用调用<1> 对象.静态成员  <2>类::静态成员函数名
  3. 因为没有this指针,所以不能用const修饰。

 

你可能感兴趣的:(C++)