C++类中静态成员数据和静态成员函数的自我理解

首先静态也就是用static声明的成员,C++中比较常见的是静态成员数据和静态成员函数。
静态的的数据比如
class sta
{
public:
int b;
static int a;
static void sty();
void fun1();
}
int sta::a=100;
void sty()
{
printf("hello static\n");
}
void fun1()
{
b=100;
printf("%d",b);
}
首先静态的成员不属于类的对象,只属于该类。不会随着类对象的建立而分配空间,也不会随着对象的撤销而释放(一般的数据成员是在对象建立时分偶空间,在对象撤销时释放)。
静态成员变量是属于该类,在类实例化之前就就在该变量,存放的空间在全局变量区(非堆或栈区)。
但是静态变量必须在类定义后初始化 int sta::a=100;必须加 数据类型 类名:: 静态数据名=初值
这里还有一个问题就是我们可以对类进行实例化比如
sta st1,st2;
然后可以st1.a=100;
那么输出printf("%d", st2.a) 结果也是100.
因为a是静态变量只有一个内存。无论对类进行多少个实例化,每个实例的a的值都是基类的a的值。静态变量a是不会随着实例化而生成成员的a。

接着讲一下静态成员函数
静态成员函数的特点是:
1、只能访问静态变量,更确切的说是可以访问全局变量,这里可以把静态变量实际上存放的空间就是和全局变量是一样的,都是在全局变量区
2、静态函数不能访问普通成员变量。比如sty()是静态函数,如果在里面写
void sty()
{
sta::b=100;
}
编译就会报错。为什么呢?
因为b是普通成员变量,只有在类初始化之后才会分配空间,而静态函数是在类之前就被编译的,因此在静态函数,b是不存在的,类还没有被初始化。
那么如果该类已经被初始化那么其实静态函数也是可以访问的。
总的来说,因为静态函数是很早被编译的,如果要访问的一些变量,这些变量必须也要初始化过。而静态变量就是先于静态函数被初始化的,所以可以访问。
如果
sta stt;
void sty()
{
stt.b=100;
}
这样是编译通过。
因为stt是全局变量,已经被初始化过了。
3、静态函数还是可以被类的对象所调用的。但是和普通函数的区别是静态类中没有this指针。而普通函数都是有this指针的,普通函数中的变量会自动变成this->变量。
比如
sta f;
f.fun1();
实际上执行的是
fun1()
{
this->b=100;
printf("%d",this->b);
}
而this就是每个类的对象的指针。
因为这样每个对象的普通成员变量就不会有相互干扰,都是不同对象中的唯一的变量。
staict函数是没有this指针的。

总之只要了解static的编译过程和内存分配过程其实C++和C语言都是相通的。
内存的四大区域
堆区、栈区、全局变量区、字符常量区。
堆区:存放new,malloc等新开辟的空间
栈区:存放局部变量
全局变量区:存放全局变量
字符常量区:存放const和和字符常量比如char a[10]="hello"; char *p="saaaa";
栈是最内部的区域,也是空间最小的区域一般不超过2M。栈是程序执行完后就自动消亡的。
栈可以访问栈,栈区可以访问全局变量区,栈区可以访问常量区。
然后栈区的内容只能由栈区的变量访问。
一般的函数都是在栈内部执行的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值