static关键字,在面向过程和面向对象中的应用

static关键字在面向过程中的使用

1.static关键字修饰局部变量,static修饰的局部变量使一个本函数私有全局变量,只能在定义它的函数里面使用,而且这个变量只会被初始化一次,在编译好的时候内存就开辟了

  和全局变量一样内存开辟在静态全局变量区

2.static关键字修饰函数和全局变量,我们知道函数和全局变量只要其他文件申明就可以直接调用,(使用其他文件的变量的时候声明的时候要加上extern 而函数可以不用加)

全局变量和函数都可以看成一个全局的符号,而static修饰后的函数和全局变量对外不可见,只能在本文件中使用,其他文件声明也找不到,(这时候这个static 可以防止命名冲突)

一些不对外开放的全局变量和函数可以使用static修饰。

 

可以看到下图,static修饰的局部变量和全局变量temp的地址都找全局变量区

 

static关键字在面向对象中的应用

1.static修饰类的成员变量,此时这个成员变量也是一个全局变量只能这个类使用,这个静态成员变量不算入类的成员大小,,成员变量属于对象,在对象创建的时候分配内存,静态成员变量在编译的时候地址就分配就存在了,所以静态成员不属于类的对象,所有对象访问静态成员的都是同一个,可以通过对象使用,也可以通过类名::静态变名使用

注意静态成员变量需要初始化格式为    类型 类名::静态变量名=值;

2.static修饰的类的成员函数,此时这个静态成员函数和静态成员变量一样,可以通过类名调用可以通过对象调用,注意的是static修饰的成员函数调用约定和普通成员的调用约定不同,

其他成员函数调用_thiscall调用约定,被调用的时候会传入一个this指针,而静态成员函数不是这个调用约定,因为可以通过类名直接调用,所以不可能传入具体对象地址,所以静态成员函数里面不能使用this指针不能访问非静态的成员变量,只能访问静态成员变量,静态成员函数和静态成员变量他们呢也都是全局的,编译了就存在了,而成员变量是定义的时候(对象创建的时候)才存储在,都可以通过类名和对象的方式调用

特点static修饰的成员函数和成员变量都遵守访问权限的控制

 

static有一个经典的案例,单例模式

就是一个类能创建一个对象,就是通过类名直接调用static函数,把构造函数设置成私有的,外部无法调用,代码如下

class Sub {
public:
    int x, y;
    void pirnt() {
        LOG(x);
        LOG(y);
    }
public:
    static Sub* GetInstant() {
        if (NULL == m_list) {
            m_list = new Sub();
        }
        return m_list;
    }
    void deleted() {
        delete this->m_list;
    }
    ~Sub()
    {
        LOG("单个对象释放");                //不能在析构函数中delete否则 delete的时候又会调用 析构函数无限递归

    }
private:
    static Sub* m_list;                         //指向对象的指针
    Sub() {}

};
Sub* Sub::m_list = NULL;              //静态成员变量的初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值