c++类static成员

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();

?>

呵呵……




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值