C++之父力作学习笔记7——模板

template<class C> class String
{
    
struct Srep;
    Srep
* rep;
public:
    String();
    String(
const C*);
    String(
const String&);

    C read(
int i) const;
    
//
}
 ;
这是一个简单的String模板。template<class C>前缀说明当前正在声明的是一个模板,它有一个将在声明中使用的类型参数C。在引入后,C的使用方式恰如其他的类型名。C的作用域将一直延伸到由这个template<class C>作为前缀的声明的结束处。注意,template<class C>只是说C是一个类型名,它不必一定是某一个类得名字。
      模板类中成员的声明和定义与在非模板类里完全一样,模板类的成员也不必在类本身的内部定义,在这种情况下,它的定义必须出现在某个地方,像非模板类的成员一样。模板类的成员本身也是模板参数化的,与它们所在模板类得参数一样。在类外定义这些成员时,就显式地将它们定义为模板。例如:
template<class C> struct String<C>::Srep
{
    C
* s;
    
int sz;
    
int n;
    
//
}
;

template
<class C> C String<C>::read(int i)const
{
    
return rep->s[i];
}


template
<class C> String<C>::String()
{
    rep 
= new Srep(0,C());
}
      在一个程序里,对一个类成员函数只能有一个函数定义。同样,对于一个类模板成员函数,在一个程序里也只能有一个函数模板定义。但在另一方面,重载只能针对函数去做,而专门化使我们能够为同一个模板提供不同的实现。
      类模板的名字不能重载。所以,如果在某个作用域里声明了一个类模板,就不能有其他以同样名字声明的实体。

posted on 2011-09-24 17:52 Daywei 阅读(335) 评论(0)  编辑 收藏 引用 所属分类: C++之父力作学习笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章档案

牛人博客

搜索

积分与排名

最新评论

阅读排行榜