c++中的模板(7) -- 模板与静态成员

当类中存在静态成员时,使用模板就会出现不同。

我们知道,静态成员共属于一个类的所有对象的,也就是类中的静态成员被所有对象共享。

那么在类模板中是否也是这样的呢? 

template <typename T>
class A {
public:
	A(const int a);
	void setB(const int b);
	int getB()const;
private:
	T a;
	static T b;
};

// 初始化静态成员
template <typename T>
T A<T>::b = 10;

template <typename T>
A<T>::A(const int a) {
	this->a = a;
}

template <typename T>
void A<T>::setB(const int b) {
	this->b = b;
}

template <typename T>
int A<T>::getB()const {
	return b;
}

int main(void) {
	A<int> a1(100);
	A<int> a2(101);
	a1.setB(100);

	A<float> f1(100);
	A<float> f2(101);
	f1.setB(1000);

	A<char> c1(100);
	A<char> c2(101);
	c1.setB(125);  // 字符类型对应的最大整数值为255

	cout << a1.getB() << endl;  // 100
	cout << f1.getB() << endl;  // 1000
	cout << c1.getB() << endl;  // 125

	system("pause");

	return 0;
}

代码分析: 

1.    我们在类模板中定义了一个静态成员b,我们在类外将其初始化为10(注意: 我们在外部初始化时,也应该加上template定义: template <typename T>)。提供两个接口,一个用于获取静态成员的值,一个用于设置静态成员的值。

2.    我们使用之前定义的类模板定义对象。在定义对象的时候传入类型实例化类型参数。我们分别传入char(对应的最大整数是255),int,float三种类型进行实例化。 

3.    对象分别是int : a1,a2。 float : f1,f2。char : c1,c2。它们都是A类的对象,只不过是实例化类型参数所使用的类型不一样。

4.    上述所属,如果满足之前的同类对象共享静态成员,那么我们在最后输出a1,f1,c1中b的值时应该是一样的。(就是最后设置的125),但是我们输出之后发现,它们并不是一样的。这是为什么呢?

原因:   我们在使用类模板之后,和使用函数模板是一样的。编译器会根据我们传入的类型,实例化类模板中使用的虚拟类型。 也就是在会根据我们传入的类型再创建一个类。所以,我们上面传入的有三种类型,所以编译器会根据我们使用的模板实现三个同名类。所以,a1,a2. f1,f2. c1,c2.在实现时,并不是同一个类的对象,所以自然它们不会共享静态成员中的数据

所以,a1,a2是编译器根据int类型实现的类的对象,我们通过a1将b设置为100,此时只有a1和a2共享这份数据。同理,f1,f2是编译器根据float数据实现的类的对象,我们通过f1将b设置为100,此时只有f1和f2共享这份数据。 c1,c2也是类似的。 

所以编译器根据不同的类型实现不同的类,对于类模板只有相同类型参数下的相同类的对象才共享静态成员中的数据。 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值