最近重拾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=它本身,所以会输出一个随机值。
转载于:https://blog.51cto.com/dreamylights/1250019