C++模板类中的静态成员

今天看书看到关于C++中Template类的相关内容,涉及到静态成员。我们知道,模板类在使用的时候会根据指定的类型进行特化,这个过程发生在编译期。(需要注意的是模板类的静态成员在模板没有特化的时候是无法使用的。)但是模板类中的静态成员又是怎样的呢,是所有特化持有一份成员还是每一个特化均持有一份成员呢,经过测试,是后者,即每个特化类型均持有一个相应的静态成员。测试代码如下:

#include <iostream>
using namespace std;

template <class Type>
class PointT
{
public:
    enum Status 
    {   
        unallocated,
        normalized,
    };  
    static PointT<Type> *freeList;
    static int chunkSize;
};

template<> int PointT<float>::chunkSize = 100;              // 特化初始化
template<class Type> int PointT<Type>::chunkSize = 10;      // 初始化(会初始化所有未特化初始化的静态成员)
int main()
{
    cout << "float chunk size : " << PointT<float>::chunkSize << ", double chunk size : " << PointT<double>::chunkSize << ", int chunk size : " << PointT<int>::chunkSize  << endl;
    PointT<float>::chunkSize = 10; 
    PointT<double>::chunkSize = 20; 
    PointT<int>::chunkSize = 40; 
    printf("%p, %p, %p\n", &(PointT<float>::chunkSize), &(PointT<double>::chunkSize), &(PointT<int>::chunkSize));
    cout << "float chunk size : " << PointT<float>::chunkSize << ", double chunk size : " << PointT<double>::chunkSize << ", int chunk size : " << PointT<int>::chunkSize << endl;
//    PointT::Status s;             // 编译失败,需要特化模板
//    PointT<float>::Status s;      // 编译成功
//    PointT::chunkSize = 1;        // 编译失败
//    PointT<double>::chunkSize = 1;// 编译成功
    return 0;
}

float chunk size : 100, double chunk size : 10, int chunk size : 10
0x10550c074, 0x10550c078, 0x10550c07c
float chunk size : 10, double chunk size : 20, int chunk size : 40

可以从上述测试代码中看出,template<> int PointT::chunkSize = 100;可以初始化float类型特化模板类的静态变量,而且template int PointT::chunkSize = 10;不会影响到float类型特化模板类的静态变量。此外有一点需要注意,PointT::chunkSize、PointT::chunkSize和PointT::chunkSize的内存地址不同,说明对于每一个特化的模板类,都有相应的一个静态变量,而且内存顺序应该是跟声明的顺序相关,这些静态变量都在静态空间内,而且是相邻的。(有一个细节需要注意,静态变量的初始化需要在文件范围内,不可以在函数内初始化,main函数也不可以,不然编译器会告诉你找不到对应的符号。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值