MST

星途 面试题库

面试题:C++ 中 static 在模板类中的初始化问题

在 C++ 模板类中定义一个 static 成员变量,描述其初始化方式与普通类中 static 成员变量初始化方式的异同,并给出一个简单的模板类示例代码,包含 static 成员变量的定义、声明及初始化。
15.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

异同点

  • 相同点
    • 在普通类和模板类中,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成员变量的值。