Cpp--static关键字作用

1,static修饰局部变量的时候

生命周期与整个程序的生命周期一致,作用域与自动变量相同。退出函数的时候,尽管该变量存在,但是不能使用。

静态局部变量若在未声明的时候未赋予初值,则系统自动赋值为0.

#include <iostream>
#include "extern.h"
using namespace std;
int main()
{
    static int a;
    int b;
    cout<<a<<endl;
    cout<<b<<endl;
    return 0;
}

result:

0
2130567168

2,static修饰全局变量

非静态全局变量的作用是在整个源程序,在各个源文件都是有效的。

而静态全局变量只作用于该源文件,不能在其他文件被引用。

比如:如果在A文件中定义static int a,再到B文件中定义全局int a就不会报错。相反就不行。

3,static修饰函数:不必担心自己定义函数与其它文件中同名(和全局变量类似,不会发生冲突)

4,static修饰函数静态局部变量:变量存储在全局区,函数退出的时候,变量仍然存储区。

#include <iostream>
using namespace std;
int func()
{
    static int a = 5;
    int b = 5;
    cout<<"static a: "<<++a<<endl;
    cout<<"int b: "<<++b<<endl;
    return 0;
}
int main()
{
    func();
    func();
    return 0;
}

结果:a是static静态变量一直存储在func中,没有释放,所以会一直累加。

5,类中的static变量:对于非静态数据成员,每个类对象都有自己的拷贝。无论这个类的对象被定义了多少个,静态数据成员在程序也只有一份拷贝。由该类型的所有的对象共享访问。静态数据成员定义时才分配空间,不能在类声明中定义。

对于非静态数据成员,每个类对象都有自己的拷贝,而静态数据成员被当作是类的成员,无论这个类被定义了多少个,静态数据成员只有一份拷贝,为该类型所有对象共享(包括其派生类),所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以它不属于特定的类对象,在没有产生类对象之前就可以用。

#include <iostream>
#include "extern.h"
int main()
{
    Cextern ex;
    Cextern ex1;
    ex.a = 5;
    std::cout<<ex.getA()<<" "<<ex.getB()<<std::endl;//5 10
    ex.addB();
    ex.addA();
    std::cout<<ex.getA()<<std::endl;//10
    std::cout<<ex.getB()<<std::endl;//20
    std::cout<<ex1.getA()<<std::endl;// 随机
    std::cout<<ex1.getB()<<std::endl;// 20
    return 0;
}
class Cextern
{
  public:
  int a;
  static int b;
  int getA()const
  {
      return a;
  };
  int getB()const{return b;};
  void addB()
  {
      b+=b;
  }
  void addA()
  {
      a+=a;
  }
};
int Cextern::b = 10;


6,static修饰成员函数,无法访问属于类对象的非静态数据成员和非静态的成员函数。与普通的成员函数相比,静态成员函数由于不是与任何的对象相联系,因此不具有this指针,从这个意义上来说,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态成员函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值