2008年(35)
分类: C/C++
2008-03-27 17:28:32
这几天看了下模板 ,以下是个人的些心得,高手见笑了
1.类模版 实例 对象定义 引起 实例化
指针,引用 不会引起实例化
类非型参数 只能是整形,枚举,外联结,且应为一个常量编译时就应确定
浮点型,类类型,。。。都不可以
2.class templates 的成员函数 在调用和取地址时实例化,在类实例化时不会自动实例化
3.class templates 的友元申明
a.非模版类型
friend class man;
friend void f(void);
friend void man::f(void);
b.一对一的模版友元
friend class man
friend void f
friend void man
c.
template
friend class man;
template
friend void f( T);
template
friend void man
4.
并不在模版定义时实例化,在类模版实例化时实例化,对应1个类型
template
int man
template
void man
{
......................
}
5.
如:
class woman
{
public:
template
class man
{
public:
print(T a)
{
cout< }
};
template
void print(T
{
cout< };
protected:
private:
};
1
template
class A
{ public:
template
A& operator =(const A
}
在使用时才实例化
但是其定义比较骇人
template
template
A
{ ...........................}
6.
特化1个类模板(所有成员必须特化包括静态类数据成员(vc),但友元模板(1:1)可以不特化,当作一个显示实参的函数模板处理即可) 或 特化1个模板 成员函数
模板成员函数特化是定义必须出现在实现文件(cpp)中,语法为
void man
{
............................
}
template <>
class man
{
......//
};
man
{
......
}
void man
{
}
static const 有序类型可以在体内初始化static const int a=10;
仅仅static 必须在体外
static int a;
int woman::a=10;
非 特化
template
int man
int man
7
类模板有1个以上模版参数(类型参数,非类型参数)
某些模版参数 被实际的型和值取代(注意是 取代 ,不是增加,减少)如:
//////////////////头文件
template
class wc
{
public:
wc()
{
cout<<"\n int T1,T2, int";
}
protected:
private:
};
template
class wc
{
public:
wc()
{
cout<<"\n in T *, T ,size";
}
protected:
private:
};
template
class wc
{
public:
wc()
{
cout<<"\n in T* ,float,size";
}
protected:
private:
};
template
class wc
{
public:
wc()
{
cout<<"\n in T* ,float,80";
}
protected:
private:
};
///////
//////main()
wc
wc
wc
wc
///////main() ,
//////main()
8.预设模板参数(只有在类模板中才指定 ,
1 .明确指定 a
2. a
template
class man
{
..........
}
写到这里突然想到
class A {
virtual void print();
};
class B:public A {
virtual void print();
};
B b;
A *a =&b;
a->print();//调用 B的,此时 print()中的this 指针是 B * const,使用B 的接口 ;
9.双重模板参数(很有用)
template
class baby
{
public:
baby ()
{
cout<<"\n in baby";
}
protected:
private:
};//
baby
////////////////////////
template
class son
{
public:
TT
son()
{
a=0;
cout<<"\n in son";
}
protected:
private:
};
son
TT
所以 GG若带默认 的模板 应该如下
template
class son
{
}
///////// 类模板类型参数 同时还可以是 类模板
10. 字符串常量在模板中的注意事项
char * a="hi ,friend ";///"hi, friend" 文字常量是 const char [10] 类型 左值转换到 const char *
限定转换到 char *,
template
ostream& operator <<(ostream & os, const T & b);//注意只有const 才能接受临时变量
cout<<"hi,friend";
cout<<"bad";
/////2个不同的模板实例
typeid(变量).name();///直接打印出变量类型
写到这,闲扯下:
栈区,堆区,全局(静态)区,文字常量,代码区,5个大区,这个是我听说的
////////////////////////////////////////////////
11.模板的编译模型
在实例化点必须能找到定义//原则
只能使用包含模式了,
a..h. cpp 在 .h最后一行包含进 cpp
b. 全部在h 或 cpp分离模式,目前支持的export 关键字i的编译器很少(vc.net 不支持)
12.
函数指针类型也能做模板类型参数
13.
模板参数可以是个类模板
template
class a
{
};
a< vector
template
void add(con
{
cout<<"ok";
}
add(a,b)//
template
class ggoo
{
public:
con
con
protected:
private:
};
ggoo