c++类的staic成员包含变量和函数两方面,我总是比较健忘,一段时间不写c++,又有点忘记了,总结下会好一些的,staic成员共同的特点是类,不属于任何对象。网上也有好多文章谈论这些,不过今天除了谈论c++类static成员的一般用法外,还想跟单例模式结合起来总结,最后,因为我也蛮喜欢php语言,再和php中的static成员来对比,意在说明,static成员在两种语言中体现的思想是一致的。
先从一般的staic变量来说起,通常在c系语言中,static变量,全局staic变量解决了不同文件重名变量冲突的问题,局部static变量解决了块作用域结束后(比如函数返回),变量释放问题,通常的说法是“带有记忆功能”,因为static在存储区域上是属于全局数据区,只有在程序结束才释放。
回到c++类中,其实本质上和c中解决的问题是一致的,想解决“共用,只有一份”的问题,单利模式是最好的一种体现,解决了在文件中随意声明全局变量的问题(这么写首先都不美观)。现在就先总结c++类中static成员的用法:
static变量
1、不属于对象,就是没有this概念
2、类内声明,类外定义
(好像还有,大家一起提提吧)
static函数
1、不属于对象,一样是没有this概念
2、不能使用非static成员,这是第1点决定的,没有this概念,非staic成员自然就是隐含this指针的。
3、类内声明,类内外定义都ok
这些网上很多文章都有写到,这里就不讨论了,主要是写static成员,在使用上的意境。先看看单例模式
单例模式,通常写成模板会有通用些:
#include<iostream>
using namespace std;
template<typename T>
class Single
{
private:
static T *inst;
public:
//产生实例对象
static T* Instance()
{
if(inst==NULL)
{
inst = new T;
}
return inst;
}
//释放实例对象
static void Release()
{
delete inst;
}
};
template<typename T>
T* Single<T>::inst = NULL;
class A
{
public:
void f()
{
cout<<"ffffffffffffff"<<endl;
}
};
int main()
{
Single<A>::Instance()->f();
Single<A>::Release();
return 0;
}
类似于这样,可以在程序的多个地方,使用Single<A>::Instance()得到类A实例对象,但都是同一个实例对象,相当于全局变量的意思。
另一种使用情景,有的时候,想在static成员函数调用非static成员函数,因为没有this概念,所以这需要一点技巧。
1、通过传递this指针给static函数
#include<iostream>
using namespace std;
class A
{
public:
void startUp();
static void f(A *inst);
void ff();
};
void A::startUp()
{
f(this);
}
void A::f(A *inst)
{
inst->ff();
}
void A::ff()
{
cout<<"fffff"<<endl;
}
int main()
{
A a;
a.startUp();
return 0;
}
这种方式,通常需要多写一个类似startUp()形式的函数类启动,就是为了传递一个this指针给static函数。
2、单例模式的思路来实现
#include<iostream>
using namespace std;
class A
{
private:
static A *inst;
public:
static A* Instance()
{
if(inst==NULL)
{
inst = new A();
}
return inst;
}
static void Release()
{
delete(inst);
}
static void f();
void ff();
};
A* A::inst = NULL;
void A::f()
{
Instance()->ff();
}
void A::ff()
{
cout<<"fffff"<<endl;
}
int main()
{
A::f();
A::Release();
return 0;
}
这个就是完全借助了
单例模式的思路来实现的。其实上面两者本质上都没有区别,允许这么说吧:没有this时转换成有this的情形,所以static都在解决一个“
共用,共享一份”的问题。
最好对比下php语言,php5.3后引入面向对象,变得很优雅,华丽转身,一些细节上的不同就不讨论了,
但和c++的思想是一致的。
<?php
class A
{
static $inst;
public static function Instance()
{
if(!isset(self::$inst))
{
self::$inst = new A;
}
return self::$inst;
}
public static function f()
{
self::Instance()->ff();
}
public function ff()
{
echo 'ffffff'.'<br>';
}
}
A::f();
?>
呵呵……