?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
C\C++里面的staticQ?/span>
面向q程的staticQ?/span>
在c和c++面向q程的设计里Q在全局变量前加上static关键字则可将该变量定义ؓ一个静态全局变量Q比如:
static int a;
那么c和c++中的静态全局变量有什么特点呢Q?/span>
1、变量在全局数据区分配内存(局部变量在栈内Q通过new和malloc动态分配的变量在堆里)Q?/span>
2、未l初始化的全局变量会被E序自动初始化ؓ0Q?/span>
3、静态全局变量或函数在声明它的文g内是可见的,在文件外是不可见的;Q可以vC护作用)
讲讲W三点,如果我们只是在某个头文g中声明了一个普通的全局变量aQ那么在引用q个头文件的时候,我们也可以通过extern关键字将q个变量引用到当前文件中Q但是如果你在声明那个变量的时候就加了static关键字,那么全局变量a对于其他M文g都是不可见的?/span>
同样的,如果以static方式定义了一个函敎ͼ那么q个函数只在定义它的文g内可见?/span>
面向对象的staticQ?/span>
在面向对象设计里面,使用static有几点要注意Q?/span>
1、静态成员函数的声明在类内要加上static关键字,但是在类外实现的时候不需要;
2、静态成员函数没有this指针Q所以不要尝试显C或隐式地在静态成员函数内引用q个指针Q这U做法会D~译期间报错。因此也׃要尝试些什么在构造函Cl静态成员变量初始化的动作了?/span>
下面写个例子感受一下面向对象的staticQ?/span>
首先定义一个头文gaccount.hQ在头文件中定义一个类Q?/span>
#pragma once
class Account
{
public:
static void reiseInterest(double var );
static double interest(){return dInterest; } //cdl出实现Q语句简单,无递归Q与cd实现q声明ؓinline函数都是相同的,均ؓ内联函数
private:
static double dInterest ;
};
double Account::dInterest = 5; //静态数据成员初始化
inline void Account::reiseInterest(double var)
{
dInterest += var;
}
接着在源文g中进行测试:
#include <iostream>
#include "account.h"
using namespace std;
int main()
{
//double Account::dInterest = 5; //错误Q!static关键字限制了可视域!Q?/span>
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;
}
q行l果如下Q?/span>