类模版静态成员初始化

首先看代码,静态数据成员分为两种情况,第一种不依赖模版类型参数,第二种依赖模版类型参数。

template <typename T> class TestTemStatic
{
    public:
    static int knownTypeVar;
    static T unKnownTypeVar;
};

那么如何初始化呢?

对于第一种存在两种初始化方式:

template <> int TestTemStatic<int/* any other type */>::knownTypeVar=2;//具化定义,给出T类型,同时定义num,T可以是其他任意特定类型。

template <typename T> int TestTemStatic<T>::knownTypeVar=50;//范化定义,定义num时不需要知道T的类型

如果你想给特定类型T的静态成员一个特定的值,使用第一种方式。如果你希望对任意类型T的都有一份通用的值,请使用第二种方式。

两种初始化可以并存,对于特定类型T如果存在具化定义,则以具化定义为准。并且对于特定类型T的具化定义不可在不同的(CPP)实现文件中重复。

//a.cpp
template <typename T> int TestTemStatic<T>::knownTypeVar=50;

//b.cpp
template <typename T> int TestTemStatic<T>::knownTypeVar=60;

范化定义可以在不同的(cpp)实现文件重复也可以赋予不同数值, 链接器负责选出唯一定义。选择哪一个与具体的编译顺序有关。

因此,范化定义可以放在头文件中,具化定义放在唯一的cpp文件中。

对于第二中只有一种初始化方式:

template <> float TestTemStatic<float>::unKnownTypeVar=4.0f;

由于unKnowTypeVar的定义依赖模版参数T的类型,所以定义unKnownTypeVar时必须给出T的类型。同样,对于特定类型T的具化定义不可在不同的(CPP)实现文件中重复。

作者水平有限,平时不怎么接触模版,如果错误请指正。

类模版静态成员初始化

时间: 2024-11-13 08:22:25

类模版静态成员初始化的相关文章

静态成员初始化与构造函数的先后顺序

最近公司有个项目的数据库需要从Oracle迁移到SQLServer中,为了方便我引入一个轻量级的ORM框架PetaPoco,并且根据相关业务进行了简单封装.之前公司的项目架构极其简陋,功能很难扩展,很少用什么框架,代码中用了很多静态方法,可能觉得直接用类名点出方法很方便的缘故,而不去考虑服务器的负担,代码分层混乱,让我不敢相信这是一家上市公司的实力.也有可能只是.NET这块比较薄弱吧.作为应届毕业生,毕竟来这里还不到一个月. 言归正传,因为项目中都是静态方法,而我加入封装好的代码时,产生了一个疑

Java类的静态成员、静态代码块、普通成员、普通代码块、构造方法初始化执行的顺序

今天阅读<Java编程思想(第4版中文版)>,刚复习到类中成员的初始化这一知识点.为了加深印象和给其他人一点参考,参考书中示例并加以修改得到以下代码: 文件名:HelloWorld.java 包名:main package main; class Bowl { Bowl(int marker){ System.out.println("Bowl("+marker+")"); } void f1(int marker){ System.out.printl

分析java类的静态成员变量初始化先于非静态成员变量

分析java类的静态成员变量初始化先于非静态成员变量 依上图中当class字节码文件被jvm虚拟机加载到内存中依次经过 连接 验证:对字节码进行验证 准备:给静态变量分配内存并赋予变量类型各自的默认值(注:基本类型为0或false,对象为null,static final修饰的常量直接赋予相应的值) 解析:类中符号引用转换成直接引用 初始化:为类的静态变量/静态语句块初始化相应的值 而类的初始化契机是:类在被第一次主动使用的情况下,主动使用包括以下6中情况: 使用new关键字实例化对象时. 调用

类的静态成员变量的声明与初始化问题总结

1. 类的静态成员变量的声明原则: 在.H文件中,用static 关键字进行前缀修饰即可,不可以直接进行初始化,基础变量除外. 如果要初始化自定义的类型,则需要在CPP文件中进行初始化 static CPerson* Police; 1 //定义状态环境类 2 /* 3 环境状态类: 4 1. 封装状态静态常量 5 2. 聚合状态 6 3. 提供上层接口 7 */ 8 class CStateContex : public CIState 9 { 10 public: 11 CStateCont

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

C++ 类的静态成员详细讲解

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 静态成员的定义或声明要加个关键static.静态成员可以是Public,Private,Protected:Public的静态成员可以通过双冒号来使用即<类名>::<静态成员名>. 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变

类的静态成员

有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联. 声明静态成员 我们通过在成员的声明之前加上关键字static使得其与类关联在一起,和其他成员一样,静态成员可以使public得或private的.静态数据成员的类型可以使常量.引用.指针.类类型等. 举个例子,我们定义一个类,用它表示银行的账户记录: class Account{ public: void calculate() {amount+=amount*interestRate;} static double r

Java 类中成员初始化顺序

Java 中的类成员 基本分为 静态成员, 实例变量  方法中特别的是静态方法和构造方法. 1.定义一个类 public class ClassLoaderTest { public int a ; public String b; private static int c; public  ClassLoaderTest(){ System.out.println("执行前:"+ a + "  "+ b); a = 10; b = "lisi"

Java 类成员的初始化顺序

Java 类成员的初始化顺序 前言:开发中碰到一个Java文件中有很多的成员变量,包括静态和非静态的,还有很多的初始化方法,很好奇这些成员的初始化顺序,在这里作个研究. ? 1 ?无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认构造函数被调用"); } } class Test { static Samp