C\C++里面的static:
面向过程的static:
在c和c++面向过程的设计里,在全局变量前加上static关键字则可将该变量定义为一个静态全局变量,比如:
static int a;
那么c和c++中的静态全局变量有什么特点呢:
1、变量在全局数据区分配内存(局部变量在栈内,通过new和malloc动态分配的变量在堆里);
2、未经初始化的全局变量会被程序自动初始化为0;
3、静态全局变量或函数在声明它的文件内是可见的,在文件外是不可见的;(可以起到保护作用)
讲讲第三点,如果我们只是在某个头文件中声明了一个普通的全局变量a,那么在引用这个头文件的时候,我们也可以通过extern关键字将这个变量引用到当前文件中;但是如果你在声明那个变量的时候就加了static关键字,那么全局变量a对于其他任何文件都是不可见的。
同样的,如果以static方式定义了一个函数,那么这个函数只在定义它的文件内可见。
面向对象的static:
在面向对象设计里面,使用static有几点要注意:
1、静态成员函数的声明在类内要加上static关键字,但是在类外实现的时候不需要;
2、静态成员函数没有this指针,所以不要尝试显示或隐式地在静态成员函数内引用这个指针,这种做法会导致编译期间报错。因此也就不要尝试些什么在构造函数中给静态成员变量初始化的动作了。
下面写个小例子感受一下面向对象的static:
首先定义一个头文件account.h,在头文件中定义一个类:
#pragma once
class Account
{
public:
static void reiseInterest(double var );
static double interest(){return dInterest; } //类内给出实现,语句简单,无递归,与类外实现并声明为inline函数都是相同的,均为内联函数
private:
static double dInterest ;
};
double Account::dInterest = 5; //静态数据成员初始化
inline void Account::reiseInterest(double var)
{
dInterest += var;
}
接着在源文件中进行测试:
#include <iostream>
#include "account.h"
using namespace std;
int main()
{
//double Account::dInterest = 5; //错误!!static关键字限制了可视域!!
cout<<"The initial interest is "<<Account::interest()<<endl;
Account ac1;
Account ac2;
ac1.reiseInterest(18);
ac2.reiseInterest(17);
cout<<"The current interest is "<<Account::interest()<<endl;
return 0;
}
运行结果如下: