最近重拾C++,学习到这几个概念,涉及到堆栈的调用、分配等等,在这里重新整理下,希与各位互相讨论学习。


静态数据成员在程序中只有一份复制品,由该类型的所有对象共享访问。非静态数据成员则不然,每个类对象都有自己的复制品。


类的静态成员必须初始化。如果静态成员是个类,那么就会调用它的构造函数。


静态成员函数为类的全部服务而不是为某一个类的具体对象服务。静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。


#include<stdio.h>
void fun(int i)
{
   static int value=i++;
   printf("%d\n",value);
}
int main()
{
   fun(0);
   fun(1);
   fun(2);
   return 0;
}


程序输出为

 0

 0

 0


#include<stdio.h>
void fun(int i)
{
   static int value=i++;
   value=i++;
   printf("%d\n",value);
}
int main()
{
   fun(0);
   fun(1);
   fun(2);
   return 0;
}


程序输出为

 1

 1

 2


注解:

static变量只初始化一次,具有“记忆”功能,与源程序“同生死,共存亡”。

auto变量存放在栈区,调用结束立刻被销毁。


在头文件中定义静态变量 ,会浪费空间或者引起程序错误。因为若每个C语言文件都使用了该头文件,则在每个头文件中会单独列出一个静态变量。


不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。


全局变量、静态局部变量与静态全局变量都在静态存储区分配空间,而局部变量在栈上分配空间。


全局变量具有全局作用域,静态变量具有稳健作用域。


静态局部变量具有局部作用域,只被初始化一次。静态全局变量具有文件作用域,如果一个程序包含多个文件,只对声明静态全局变量的文件生效。


#include<stdio.h>
static int j;
int k=0;
int m;
void fun1()
{
   static int i=0;
   i++;
   m=i;
}
void fun2()
{
   j=0;//如果没有此行的初始化,j的值最后也会变为10
   j++;
}
int main()
{
   for(k=0;k<10;k++)
   {
      fun1();
      fun2();
   }
   printf("%d\n",m);
   printf("%d\n",j);
   return 0;
}


注解:

i为静态局部变量,只被初始化一次。

j是静态全局变量,每次函数调用的时候都被初始化。

全局变量只定义未初始化默认为0;

局部变量只定义未初始化,若是int类型,则默认的是-858993460,即0xcccccccc。


#include<stdio.h>
int my(const int a)
{
   static int count=a;
   return count + a;
}
int main()
{
   printf("%d\n%d\n",my(4),my(5));
   return 0;
}


程序输出结果入如下:

  9

  10


注解:

printf函数总是从列表变量的右端开始计算压栈,再从左到右对应弹出栈。


局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。要使用全局变量,需要使用操作法::。


#include<stdio.h>
int i=1;
int main()
{
   int i=i;
   printf{"%d\n",i);
   return 0;
}


程序输出结果:

  -858993460


注解:

main函数里面定义的i会屏蔽掉全局变量i,致使定义的i=它本身,所以会输出一个随机值。