Static的理解

1.为什么要使用static? ? ?

在函数内部定义一个变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,在栈上分配的空间在此函数执行结束后会释放,如果想将该变量
的值保存至下一次调用;(可能首先想到的是定义一个全局变量,但是全局变量有很多缺点,最明显的是破坏了此变量的访问范围,
该全局变量不仅仅受此函数的控制)静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

2.什么时候需要用static? ? ?

需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装 性,即要求此成员隐藏在类的内部,对外不可见;

3.static的三大作用:::

在C语言中的作用:::

1)static 修饰局部变量,改变变量的“生命周期”,生命周期跟随整个程序;
------该变量在全局数据区分配内存;
------静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的 函数调用不再进行初始化,如果没有显式初始化,会被程序自动初始化为0;
------它始终驻留在全局数据区,直到程序运行结束。但其作用域为“局部作用域”,当定义它的函数或语句块结束时,其作用域随之结束;
2)static修饰全局变量(static int n ),改变变量的“作用域”,只在当前文件中生效
-----即若另外一个文件用extern int n 也无法使用该变量
3) static修饰函数,改变变量的“作用域”,只在当前文件中生效;

在C++中的作用:::

1) static修饰类的成员
 ----静态数据成员是该类的所有对象所共有的
 ----得在“类外定义”,且在内外定义时不可以用static修修饰
静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义(因为如果在类中定义类的对象,类不知道为其分配多少空间,会报错,但是可以定义指向自身类型的指针或引用作为内部成员,由于指针和引用所占存储空间大小与类型无关,所以编译器可以计算分配空间);
-----类外的定义方式 (数据类型  类名::该静态成员=给定的值)
class dog{ 
dog tt; //error, ‘tt’ uses undefined class ‘dog’

};
class dog{ 
dog *Zhlu; //ok 
dog& SKII; //ok 
};
2)static修饰成员函数

------出现在类体外的函数定义不能指定关键字static;
------没有this指针;(this 是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针)
------静态成员函数不能访问非静态成员函数和非静态数据成员;
------非静态成员函数可以任意地访问静态成员函数和静态数据成员;

#include <iostream>
using namespace std;
class Myclass
{
    public : 
        Myclass(int a, int b, int c);
        static void GetSum(); // 声明静态成员函数
    private : 
        int a, b, c;
        static int Sum; //声明静态数据成员
};
int Myclass::Sum=0; //定义并初始化静态数据成员
Myclass::Myclass(int a, int b, int c)
{
    this->a = a;
    this->b = b;
    this->c = c;
    Sum += a + b + c; //非静态成员函数可以访问静态数据成员
}
void Myclass::GetSum() //静态成员函数的实现
{
    // cout<<a<<endl; //错误代码,a是非静态数据成员
    cout<<"Sum="<<Sum<<endl;
}
int main()
{
    Myclass M(1, 2, 3;
    M.GetSum();
    Myclass N(4, 5, 6;
    N.GetSum();
    Myclass::GetSum();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记得多喝热水…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值