13模板类里面static变量定义的属性在二次编译时产生不同的属性的变量

/*

编译器并不是把函数模板处理成能够处理任意类的函数
编译器从函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译
在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。
*/
#include<iostream>
using namespace std;
template <typename T>
class AA
{
public:
	static T m_a;
};
template <typename T>
T AA<T>::m_a = 0;//需要在前面加上T,相当于修饰符

class AA1
{
public:
	static int m_a;
};
int AA1::m_a = 0;

class AA2
{
public:
	static char m_a;
};

char AA2::m_a = 0;
int main(void)
{

	AA<int>a1, a2, a3;
	a1.m_a = 10;
	a2.m_a++;
	a3.m_a++;
	cout << AA<int>::m_a << endl;

	AA<char>b1, b2, b3;
	b1.m_a = 'a';
	b2.m_a++;
	b3.m_a++;
	cout << AA<char>::m_a << endl;

	//m_a 应该是 每一种类型的类 使用自己的m_a
	system("pause");
	return 0;
}
/*
static关键字定义的属性属于整个类的共有

但是模板里的static在具体化的时候产生的变量是单独产生的,不是只产生一次

static定义的变量每个家族类都有自己的m_a 。应该是 每一种类型的类 使用自己的m_a

	从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员
	 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化
	 每个模板类的具体话后有自己的类模板的static数据成员副本

=========================================================================
12
c
请按任意键继续. . .

=========================================================================


*/

猜你喜欢

转载自blog.csdn.net/baixiaolong1993/article/details/89482668