C++ Primer 学习笔记_82_模板与泛型编程 --类模板成员[续2](二)

2014-11-24 13:11:01 · 作者: · 浏览: 8
ront() const { return items.front(); } void push(const Type &t) { items.push_back(t); } void pop() { items.erase(items.begin()); } bool empty() const { return items.empty(); } private: list items; };



七、类模板的static成员

类模板可以像任意其他类一样声明static成员。

template 
  
    class Foo
{
public:
    static std::size_t count()
    {
        return ctr;
    }

private:
    static std::size_t ctr;
};

  

定义了名为Foo的类模板,它有一个名为count的publicstatic成员函数和一个名为ctr的privatestatic 数据成员。

Foo类的每个实例化[谨记:不是每个对象]都有自己的static成员:

    Foo
  
    fi,fi2,fi3;

    Foo
   
     fs; 
   
  

每个实例化表示截然不同的类型,所以给定实例化所有对象都共享一个static成员。因此,Foo 类型的任意对象共享同一static成员 ctr,Foo 类型的对象共享另一个不同的ctr成员。



1、使用类模板的static成员

通常,可以通过类类型的对象访问static成员或者使用作用域操作符直接访问static成员。当然,当试图通过类使用static成员的时候,必须引用实际的实例化:

    Foo
  
    fi,fi2;
    size_t ct = Foo
   
    ::count(); ct = fi.count(); ct = fi2.count(); ct = Foo::count(); //Error:不知道运用哪个实例化 
   
  

注:static成员函数只有在程序中使用时才进行实例化



2、定义static成员

像使用任意其他static数据成员一样,必须在类外部出现数据成员的定义。在类模板含有static成员的情况下,成员定义必须指出它是类模板的成员:

template 
  
   
std::size_t Foo
   
    ::ctr = 0; 
   
  


static数据成员的名字以Foo ::为前缀,表示成员属于类模板Foo。