C++静态变量和全局变量

除了栈变量之外,还有两种变量比较常见,一种是静态变量,一种是全局变量。它们都定义在程序的静态存储区。

静态变量定义时,其类型前需要加上static关键字加以说明。它的生命周期从被定义时刻起到整个程序结束,不伴随作用域结束而结束。我们讨论static时,将会就static对变量和函数的限制单独讨论。

含有static标记的变量如果定义在某个被调用函数中,则它只在第一次调用时被赋予初值,之后多次执行到该定义语句时直接使用已经存在的变量及其变量值。

如果static用于定义类中成员变量,首先需要确定的是类的静态成员变量依旧是定义在静态存储区。当某个类中定义了静态成员变量,这时它被当成整个类的全局对象,无论这个类的对象被定义了多少个,所有的类共享一份拷贝,假设类中定义了两个int类型变量,其中一个定义成static int类型时,若此时对定义的对象使用sizeof函数时,得到的仅仅是一个int类型数据的大小。可见静态成员变量并不被某个对象所私有而是被多个对象所共享的,当我们对其进行访问时并不需要通过某个具体的对象。

访问方式:

1 .对象.名静态数据成员

2. 类名::静态数据成员

最典型的例子就是银行账户类(如下),每个人拥有独立的账户信息,但是银行利率这个变量过却是static变量,这样无论创建了多少新用户,所有用户面对的利率都是统一的,并且相比于将利率设置成外部变量,这样更有利于数据的隐藏和安全(static变量可设置成private类型),至少利率这一项数据并不适合作为外部变量来随意更改。

class Account

{

    public:

       static set_rate(const double& x) { m_rate = x; }

       Account();

       ~Account();

    private:

       static double m_rate;

};

double Account::m_rate = 8.0;

在成员函数前加static就被声明成静态成员函数,静态成员函数最大的特点是其只能访问静态成员变量和调用其他静态成员函数,对于非静态成员变量不可以直接访问。还有一点需要注意的是,静态成员函数与类相联系但不与类的对象联系,它为某一个类服务但不是为类的某一具体对象服务。

成员函数默认隐含了指针this,所定义的对象中成员函数和数据之间具有关联性,但是在静态成员函数中使用this指针进行的访问操作都是不被允许的。

对静态成员函数的访问可以通过成员访问操作符(.和->)来为类对象或者指向类对象的指针调用。

访问方式:

1. 对象名.静态成员函数

2. 指针->静态成员函数

全局变量的生命周期在main函数之前并且也是一直到程序结束,其作用域是整个程序。所以说静态变量和全局变量生命周期上结束的时间均是整个程序末端,也都是定义在程序的静态存储区,本质上来说静态变量就是全局变量。二者的主要不同在于:全局变量在多个源文件中均可以访问,静态变量却只能在其作用域内被访问。我们可以这么理解,局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

 

Advertisements