1.模板:
函数模板的定义:编译器会根据实例化推断模板类型参数
template<typename T>//以template开始的,用尖括号表示模板参数列表.类型参数前必须加class和typename,且两者无差别
bool less(const T &a,const T &b)//函数体
{
if(a<b) return true;
return false;
}
实例化:less(2,1);
非类型模板定义:
template<unsigned int N, unsigned int M>
int com(const char (&p1)[N],const char(&p2)[M] )
{
return strcmp(p1,p2);
}
我们在实例化这个模板时:com("hi","mom");编译器会自动识别字符数组,并且在末尾加‘\0’结束符,所以这里的N=3,M=4
注意:绑定到非类型模板的实参一定是常量,或者是静态数据。
2.关键字:inline,在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。这个只是为了提高效率,具体参见http://blog.sina.com.cn/s/blog_90e888f50100zgo2.html,感觉讲的很详细。只有函数体本身比较小,又经常被用到才会使用内联函数。
关键字inline与模板类结合的定义为:template<typename T> inline T min(const T &,const T &);//正确
inline template<typename
T> T min(const T &,const T &);//错误。
3.类模板:编译器无法根据实例化推断模板类型参数
定义:template<typename T> class blob{}
4.可变参数模板:
template<typename T,typename ....args>//告诉编译器有不定个模板参数
void foo(const T &t,const Args&..........);//
编译器会在实例化时从左到右依次判断有多少个参数包,我们可以用sizeof...(args)来求出函数参数的数目。
5.包扩展
template<typename T,typename ....args>
ostream &//备注需要扩展的类型
print(ostream &os,const T &t,const Args &)
{
//函数体。
}
6.模板特例化:
template<>
int com(const char*const &p1,const char* const &p2)
{
return strcmp(p1,p2);
}
模板特例化是为了让传过来是字符串的话就直接调用这个特例化的版本。
7.tuple类型:这个是标准库中的,包含在头文件#include<tuple>中,类似于pair和vector,只是pair规定的是两个成员数目,而tuple可以有任意个成员数目。
具体介绍看下http://blog.youkuaiyun.com/fjb2080/article/details/15809097
8.bitset类:二进制位来进行操作的,包含在头文件#include <bitset>具体介绍看下面链接:
http://blog.163.com/lixiangqiu_9202/blog/static/53575037201251121331412/
9.正则表达式:http://blog.sina.com.cn/s/blog_ac9fdc0b0101oow9.html
10.虚基类:解决基类多个继承的问题,如下:
class
CBase { };
class CDerive1:virtual public CBase{ };
class CDerive2:virtual public CBase{ };
class CDerive12:public CDerive1,CDerive2{ };
则在类CDerive12的对象中,仅有类CBase的一个对象数据
基类的特点:
虚基类构造函数的参数必须由最新派生出来的类负责初始化(即使不是直接继承);
虚基类的构造函数先于非虚基类的构造函数执行。