c++中关于static的理解


一、修饰成员变量

  1、c++中,静态变量采用的是静态存储方式。不过,使用静态存储方式的不一定就是静态变量。例如:全局变量。全局变量虽然不是静态变量,但是存储方式是静态的。

2、静态变量包括:静态局部变量和静态全局变量。全局变量再加以static修饰,就变成了静态全局变量。由于全局变量本来就是静态存储方式,再冠以static,当然还是静态存储方式。


3、静态全局变量和不同的全局变量再存储方式上是没有区别的,二者的区别仅在于:

a、普通的全局变量的作用域是整个源程序,即当一个源程序有多个源文件组成时,普通的全局变量再各个文件内都是有效的。

b、静态全局变量则限制了其作用域,即该变量只能在其所定义的源文件内有效,而在同一源程序的其他原文件中不能使用。


4、类的static数据成员是属于类的,而不是具体的某个对象。它不因对象的创建而产生,也不因对象的撤销而消失。


5、static成员变量属于类,所以需要对它进行初始化,且不能在类内初始化。(其实一直在纠结到底是“必须初始化”呢,还是“需要初始化”,如果非要钻语法的牛角尖,还是写成“需要初始化”吧!)

注意:

class Myclass

{

   private:

static int s_num; //  没初始化????   其实并不是

};

void main()

{

   system("pause");
}

上面的程序运行时正确的,并不是该结论是错误的,而是,那条语句并不是定义语句,只是一条声明语句,所以当然不会报错。

这段代码其实没任何意义,也只能出现在讨论static的用法的语境中。


6、static数据成员属于类,对它的初始化不能在构造函数中进行。因为创建一个对象就会调用类的构造函数,而变量的初始化应该只被设定一次。


7、static成员变量是需要初始化的,且初始化只能在类外,
初始化格式为:

<类型> <类名>::成员变量名=value; //不需要再加static修饰

static Myclass::temp=10;

不过存在一个特殊情况,const,static 同时修饰的成员变量必须在类内初始化。

二、修饰成员函数

   1、静态成员函数:使用static修饰的成员函数。

2、静态成员函数是不能声明为虚函数的。因为静态成员函数也是属于类的,而不是具体的某个对象。定义了静态成员函数,只要类存在,那么静态成员函数就存在,不因对象的存在有无而变化。由于静态成员函数属于类,而不属于对象,所以不存在this指针。

3、对静态成员函数的访问不需要通过对象,当然使用对象也能访问。

Myclass m1;

   a、使用对象访问:m1.静态虚函数名(参数列表);

   b、使用类名访问:Myclass::静态函数名(参数列表);

4、静态成员函数只能访问类内的静态数据成员、静态成员函数和类外的函数或数据,不能访问类内的非静态成员。相反的,非静态的成员函数是可以访问静态成员变量和静态成员函数的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值