欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

类模板中的静态变量

程序员文章站 2024-02-22 22:27:16
...

先上代码,具体看输出和注释:

/*

编译器并不是把函数模板处理成能够处理任意类的函数
	编译器从函数模板通过具体类型产生不同的函数
	编译器会对函数模板进行两次编译
	在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。
*/

#include <iostream>
using namespace std;

template <typename T>
class AA
{
public:
	static T m_a;
protected:
private:
};

template <typename T>
T AA<T>::m_a = 0;  //必须要进行初始化,否则要报错





void main()
{
	AA<int> a1, a2, a3;
	a1.m_a = 10;
	a2.m_a++;
	a3.m_a++;
	cout << AA<int>::m_a << endl;   //输出 12

	AA<char> b1, b2, b3;
	b1.m_a = 'a';
	b2.m_a++;
	b2.m_a++;
	cout << AA<char>::m_a << endl;   //输出 'c'
	cout << AA<int>::m_a << endl;   //输出 12

	//m_a 应该是 每一种类型的类 使用自己的m_a
	cout << "hello..." << endl;
	system("pause");
	return;
}

总结:

       在c++中,类模板中的静态变量,对于每一个具体类型,都会有不同的静态变量。比如对于int型,其有多个对象,这些对象共享同一个静态变量,对于char型,其有多个对象,这些对象也共享同一个静态变量,但是int型对象共享的静态变量和char型共享的静态变量是不一样的。这是类模板的特殊性,因为int型对应的类和char型对应的类本身就不一样了。

      总之,在c++中,无论是对于函数模板还是类模板,c++编译器都会进行两次编译,第一次编译是编译函数模板或则类模板本身的代码,第二次编译是编译具体类型替换后的代码,哪怕是对于同一个模板,对于不同的类型,编译的代码都是不一样的,比如上述代码中的int和char, 只不过由于模板的存在,而不用程序员写两个类,c++编译器帮助我们做了。

相关标签: c++