static注意事项与语法简述

1.存在语言:Static存在多个语言当中,JavaC++CC#等语言中都有该变量

       面向过程:

       1.静态变量在全局数据区分配内存

       2.静态全局变量不能被其他文件引用,并且其他文件可以定义相同名字的变量,并不会发生冲突。全局变量默认是没有static修饰的,也就是说作用域为整个工程,在一个文件中定义,在另一个文件中可以通过extern或者include方式引用,而static修饰后的全局变量,作用域变为定义的整个文件,只在文件内部生效,无法被外部链接,所以其他文件可以定义相同名称的变量

       3.静态局部变量即使函数return(结束),也不会被释放。因为static修饰变量是是放在全局数据区的,即使自定义函数结束,也不会被释放掉。所以常会用在第一次给static修饰局部变量一个初值,每次做算数操作(++ --)都会被保存下来(因为只会被初始化一次)

       4.静态函数不能被其他文件引用,作用域为本文件,其他文件可以定义相同名称的函数。

       5.C语言中将静态函数称为内部函数,能被文件外部调用的函数称为外部函数

       面向对象:

       1.静态数据成员:

#include <iostream>

using namespace std;

class Myclass

{

    public:

        Myclass(int a, int b, int c);

        void GetSum();

    private:

        int a;

                int b;

                int 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<<"Sum="<<Sum<<endl;

}

int main()

{

    Myclass M(1, 2, 3);

    M.GetSum();

    Myclass N(4, 5, 6);

    N.GetSum();

    M.GetSum();

}

       上面例子类内部的静态变量内存是共享的,所以无论是M.GetSum还是N.GetSum最后打印的都是15

       需要注意的是静态数据成员不能在类内部定义(因为初始化定义就需要分配内存),并且不能在头文件中对其进行定义,那样当多个源文件引用头文件会造成重复定义;

       如果该例子中Sumpublic成员的话,可以通过<类对象名>.<静态数据成员名> <类类型名>::<静态数据成员名>引用静态数据成员;

       静态数据成员主要用在多个对象都有同一项属性的时候,一方面能够节约内存(多个对象中静态数据成员公用分配内存),一个位置修改该静态数据成员,所有

对象的该成员数据均发生变化(不用一个个改,为整个类服务);

       静态数据成员相对于全局变量一个是不存在名称冲突的问题,另一方面如果该成员是private成员,可以实现信息的隐藏;

2.静态成员函数

    静态成员函数不能调用非静态数据成员变量和函数,只能调用其余静态成员函数和成员变量。但非静态成员函数可以调用它。因为静态成员函数与静态数据成员类似服务类而非对象,所以我们不光可以通过<类对象名>.<静态数据成员名> <类类型名>::<静态数据成员名>两种方式来调用。

参考:https://baike.baidu.com/item/static/9598919?fr=aladdin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值