面试题答案
一键面试异同点
- 相同点:
- 在普通类和模板类中,
static
成员变量都需要在类外进行初始化,以分配实际的存储空间。这是因为类定义只是一个蓝图,并不为static
成员变量分配空间,只有在类外初始化时才分配。
- 在普通类和模板类中,
- 不同点:
- 普通类中,
static
成员变量的初始化相对简单,直接在类外通过类名::变量名 = 初始值;
的方式进行初始化。例如:
- 普通类中,
class NormalClass {
public:
static int staticVar;
};
int NormalClass::staticVar = 10;
- 模板类中,由于模板的实例化特性,
static
成员变量的初始化要复杂一些。当模板被实例化时,每个实例化的模板类都会有其独立的static
成员变量实例。初始化需要在模板类定义之后,使用template<> 模板类名<模板参数>::静态成员变量名 = 初始值;
的形式,并且要确保在使用该模板类的实例之前进行初始化。
模板类示例代码
#include <iostream>
// 模板类定义
template <typename T>
class TemplateClass {
public:
static T staticVar;
};
// 模板类 static 成员变量声明与初始化
template <typename T>
T TemplateClass<T>::staticVar;
// 主函数
int main() {
// 模板类实例化
TemplateClass<int> intInstance;
TemplateClass<double> doubleInstance;
// 设置并输出 static 成员变量
TemplateClass<int>::staticVar = 42;
std::cout << "TemplateClass<int>::staticVar: " << TemplateClass<int>::staticVar << std::endl;
TemplateClass<double>::staticVar = 3.14;
std::cout << "TemplateClass<double>::staticVar: " << TemplateClass<double>::staticVar << std::endl;
return 0;
}
在上述代码中,TemplateClass
是一个模板类,它有一个static
成员变量staticVar
。在类外对staticVar
进行声明与初始化,之后在main
函数中实例化了TemplateClass<int>
和TemplateClass<double>
,并分别设置和输出它们各自的static
成员变量的值。