类模板中的静态变量
程序员文章站
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++编译器帮助我们做了。