所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。
template <类型形式参数表>
函数模板不允许自动类型转化; 普通函数能够进行自动类型转换.
函数模板和普通函数在一起,调用规则:
1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑普通函数
3 如果函数模板可以产生一个更好的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只通过模板匹配
gcc常用编译选项
选项 | 作用 |
-o | 产生目标(.i、.s、.o、可执行文件等) |
-c | 通知gcc取消链接步骤,即编译源码并在最后生成目标文件 |
-E | 只运行C预编译器 |
-S | 告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s |
-Wall | 使gcc对源文件的代码有问题的地方发出警告 |
-Idir | 将dir目录加入搜索头文件的目录路径 |
-Ldir | 将dir目录加入搜索库的目录路径 |
-llib | 链接lib库 |
-g | 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试 |
编译器并不是把函数模板处理成能够处理任意类的函数
编译器从函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译
在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。
类模板用于实现类所需数据的类型参数化,类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响。
template <class T>
class A
{
public:
A(T a)
{
this->a = a;
}
public:
void printA()
{
cout << "a: " << a << endl;
}
protected:
T a;
};
/*
从模板类派生了普通类
模板类派生时, 需要具体化模板类. C++编译器需要知道父类的数据类型具体是什么样子的.
要知道父类所占的内存大小是多少,只有数据类型固定下来,才知道如何分配内存.
*/
class B : public A<int>
{
public:
B(int a=10, int b=20) : A<int>(a)
{
this->b = b;
}
void printB()
{
cout << "a:" << a << " b: " << b << endl;
}
protected:
private:
int b;
};
/*模板类 派生 模板类*/
template <typename T>
class C : public A<T>
{
public:
C(T c, T a) : A<T>(a)
{
this->c = c;
}
void printC()
{
cout << "c:" << c <<endl;
}
protected:
T c;
};
//类模板做函数参数参数,C++编译器要求具体的类,所以所要 A<int> &a
void UseA( A<int> &a ) //
{
a.printA();
}
void main()
{
//模板类(本身就是类型化的)====具体的类=====>定义具体的变量
A<int> a1(11), a2(20), a3(30); //模板类是抽象的 ====>需要进行 类型具体
//a1.printA();
UseA(a1);
UseA(a2);
UseA(a3);
B b1(1, 2);
b1.printB();
C<int> c1(1, 2);
c1.printC();
cout<<"hello..."<<endl;
system("pause");
return ;
}
未完继续