网站有些什么内容,在威联通上搭建wordpress,建筑企业资质查询官方网站,职业学校网站模板泛型编程#xff1a;编写的是与类型无关的通用代码#xff0c;是代码复用的一种手段#xff0c;模板是泛型编程的基础。 1.函数模板#xff1a;类型参数化#xff0c;增加代码复用性。例如对于swap函数#xff0c;不同类型之间进行交换都需要进行重载#xff0c;但是函数… 泛型编程编写的是与类型无关的通用代码是代码复用的一种手段模板是泛型编程的基础。 1.函数模板类型参数化增加代码复用性。例如对于swap函数不同类型之间进行交换都需要进行重载但是函数体不变就可以体现模板的优越性。
模板参数两种给出方法1.自动类型推导2.显示类型确定
#includeiostream
using namespace std;//都是进行交换
//不同类型参数的重载代码冗余复用性低
//模板是将类型当作参数进行传递//函数模板
template typename T
void Swap(T a, T b)
{cout typeid(T).name() endl;T tmp a;a b;b tmp;
}void test01()
{int i1 10, i2 20;char c1 a, c2 b;double d1 1.5, d2 5.1;Swap(i1, i2);//自动类型推导Swapchar(c1, c2);//显示类型指定Swapdouble(d1, d2);cout i1 i1 i2 i2 endl;cout c1 c1 c2 c2 endl;cout d1 d1 d2 d2 endl;
}void main()
{test01();system(pause);
}
在自动类型推导中T类型必须一致不然出现二义性。 解决方案1
void test02()
{int a 10;//4字节double b 1.23;//8字节Swap(a, (int)b);//Swap((double)a, b);//报错 涉及引用修改了原空间范围Swapint(a, (int)b);
}
解决方案2
template typename T1, typename T2
void Swap(T1 a, T2 b)
{cout typeid(T1).name() endl;T1 tmp a;a b;b tmp;
}
另一个例子
#includeiostream
using namespace std;templatetypename T
T Func(T a, T b)
{T value a b;return value;
}void test01()
{int a 10;double b 1.35;Func(a, (int)b);Func((double)a, b);//不修改原空间大小可以强转Funcint(a, b);
}void main()
{test01();system(pause);
} 在调用函数模板时并不是直接执行函数模板在编译器底层模板会根据不同的类型传入生成不同的模板函数。所以母体就是函数模板实际执行的是模板函数。所以模板看起来比较简洁但是执行效率不高。 模板实例化调用函数模板生成特定版本函数的过程。隐式实例化-模板类型推导显式实例化通过类型确定。 注意模板不会进行隐式类型转换也就是类型的传入不能产生二义性。普通函数支持隐式类型转换。 当函数模板和普通函数都匹配调用时会采用最佳匹配原则。
#includeiostream
using namespace std;templatetypename T
T Func(T a, T b)
{T value a b;return vale;
}int Func(int a, int b)
{int value a b;return value;
}void test01()
{Func(1, 2);//调上面Func(1.1, 2.2);//调下面Func(a, b);//调下面Funcint(a, b);//调下面Funcint(1, 2);//调下面Func(1, 2.1);//调上面
} 类模板类中的数据类型参数化就可以得到类模板。注意函数模板的每一个成员函数在类外实现时都是函数模板需要带上templatetypename T在作用域限定符中也要加上T。
c的类中需要常量可以用这三种方法给出宏定义、 枚举私有成员变量、const常量(私有成员变量)。
#define AAA 8enum
{ BBB8};const int CCC 8;
模板类的参数可以是一个已经实例化的模板类例如使用vector实现二维数组。
vectorvectorint arr;
类模板实例化时需要指定参数类型它不能推导类型利用类名数据类型 对象名来实例化。
类模板和函数模板都可以用于处理自定义数据类型自定义类需要用到运算符重载。
内置类型的零初始化固定写法系统自动生成不会发生隐式类型转换。其实就是赋各种0值。
零初始化也可以用于类模板用于自定义数据类型。比较灵活。零初始化语法T 变量名 T();
调动默认构造函数或者全缺省构造函数进行赋值。
#includeiostream
using namespace std;void main()
{int a int();char ch char();double d double();float f float();system(pause);
} 类模板不支持分离编译类模板的成员函数的创建时机在调用时分文件编写时链接不到所以一般通过包含.cpp或者.hpp声明和定义放一起的方式来给出。
extern 关键字让全局变量在同一工程下被不同的.cpp文件外部引入并使用。
STL:标准模板库开个头
六大组件容器、算法、仿函数、迭代器、适配器配接器、空间配置器。
STL缺点更新慢、不支持线程安全、追求效率导致内部复杂、存在代码膨胀的问题。但是作为大佬造好的轮子不会不行
P.J.版本对应vc6.0 SGI版本对应STL源码剖析。
#includeiostream
#includelist
using namespace std;void test01()
{listint mylist;for (int i 0; i 10; i){mylist.push_back(i);}for (auto e : mylist){cout e -;}cout over. endl;for (listint::iterator it mylist.begin(); it ! mylist.end(); it){cout *it -;}cout over.endl;
}void main()
{test01();system(pause);
}