C++静态变量和静态函数的小结
最近由于工作的关系,要做一个简单的输入法,当然是要移植到arm板上去的。没有想自己做,就到网上找到两个用Qt输入法打代码,自己整合了一下,最后的效果差强人意吧!在这里把整合中遇到的对静态变量的使用的一点小小的总结写在这里,只当自己学习的一个记录,如有错误,还望大家指出,共同提高!
下面通过一个简单的例子来看看:
class SyszuxIM:public QWSInputMethod
{
Q_OBJECT
public:
SyszuxIM();
~SyszuxIM();
void updateHandler(int);
static void installInputMethod();
static void releaseInputMethod();
static SyszuxIM* instance();
static SyszuxIM* pInputMethod ;
public slots:
void confirmString(QString gemfield);
private:
SyszuxPinyin* syszuxpinyin;
//设置输入法底框的颜色
void setInputColor( const QColor &color ) ;
};
这个里面主要是在类中有一个这个类的一个静态的指针变量。以前一直没有这么用过,其实想想在c语言结构体中是经常这么用的。链表中也就是一直这么用的,因为c++的类是结构体的一个扩展。所以在类中这么用也应该是很正常的。
不过在c++中有种新的用法:
struct SyszuxIMPrivate
{
static SyszuxIM* pInputMethod;
};
因为毕竟不是要做链表用,所以单独用一个结构体来定义一个数据类型。这样看着舒服些。在这里记录一笔只是给自己留个记号,以后自己程序中可以这么用。
下面是对静态变量与静态函数的一个总结,作为自己的个备忘录,
在C语言中有静态数据类型,声明一个静态数据类型意味着:该变量的生存周期是
静态的,即在程序的开始即分配到程序,终止时才释放。在C++中,声明一个类的静态数据成员意味着所有的实例只有该数据成员的一个拷贝。
《深入浅出MFC》这样解释:
Static 成员不属于对象的一部分,而是类的一部分。所以程序可以在没有诞生分和
对象的时候就处理此种成员变量.但必须首先初始化它。
不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一
再被调用,而变量的初值只应该设定一次。也不要把初始化操作安排在头文件中,
因为它可能被载入到许多地方,因此就可能执行许多次。你应该在应用程序文件中,
类以外的任何地方设定其初始值。例如在main之中,或者全局函数中,或任何函数
之外:
double SavingAccount :: m_rate = 0.0075;//设定atatic成员变量初值
void main() {… …}
这么做可曾考虑到m_rate是个private数据?没关系,设定static成员变量初值
时,不受任何存取权限的束缚。请注意,static成员变量的类型也出现在初值设定
中,因为这是一个初值设定操作,不是一个赋值(assignment)操作。事实上,staic
变量在这个时候(而不在类声明中)才定义出来。如果你没有做这个初始化操作,
会产生连接错误。
下面是存取static成员变量的一种方式,注意,此刻还没有任何对象实例:
//第一种存取方式:
void main()
{
SavingAccount::m_rate = 0.0075; //欲此成立,须把m_rate改为public
}
下面是这种情况则是产生一个对象后,通过对象来处理static成员变量:
//第二种存取方式:
void main()
{
SavingAccount myAccount;
myAccount.m_rate = 0.0075; //欲此成立,须把m_rate改为public
}
Static成员变量并不是因为对象的实现才得以存在的,它本来就存在,你可以想象
它是一个全局变量。只要access level允许,任何函数都可以存取static成员变
量。但是如果你希望在产生任何对象之前就存取其class的private static成员
变量,则必须设计一个static成员函数:
由于static成员函数不需要借助于任何对象,就可以被调用,所以编译器不会为它
暗加一个this指针。因此static成员函数无法处理类之中的non-static成员变量。