c++模板(函数模板和类模板)

c++有两种模板机制:函数模板和类模板;

模板机制就是把类型参数化,即给与一个虚拟的类型,再根据需要,在确定具体的类型;

语法:

函数模板:template <typename T>//T

                类型  函数名(形参列表)

                {

                    业务逻辑语句

                 }

调用实例:

            函数名<具体的类型>(参数);

    

声明:

template<typename T>

T Max(T a, T b)

{

         cout<<"TMax(T a, T b)"<<endl;

         returna > b ? a : b;

}

调用:Max<int>(1,2)


原理探究:首先讲讲编译:

什么是gcc

gcc(GNU C Compiler)编译器的作者是Richard Stallman,也是GNU项目的奠基者。

什么是gcc:gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等

gcc支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持

gcc主要特征

1)gcc是一个可移植的编译器,支持多种硬件平台

2)gcc不仅仅是个本地编译器,它还能跨平台交叉编译。

3)gcc有多种语言前端,用于解析不同的语言。

4)gcc是按模块化设计的,可以加入新语言和新CPU架构的支持

5)gcc是自由软件

gcc编译过程

预处理(Pre-Processing)

编译(Compiling)

汇编(Assembling)

链接(Linking)

Gcc *.c –o 1exe (总的编译步骤)

Gcc –E 1.c –o 1.i  //宏定义 宏展开

Gcc –S 1.i –o 1.s

Gcc –c 1.s –o 1.o 

Gcc 1.o –o 1exe

结论:gcc编译工具是一个工具链。。。。

hello程序是一个高级C语言程序,这种形式容易被人读懂。为了在系统上运行hello.c程序,每条C语句都必须转化为低级机器指令。然后将这些指令打包成可执行目标文件格式,并以二进制形式存储器于磁盘中。

gcc常用编译选项

选项

作用

-o

产生目标(.i、.s、.o、可执行文件等)

-c

通知gcc取消链接步骤,即编译源码并在最后生成目标文件

-E

只运行C预编译器

-S

告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s

-Wall

使gcc对源文件的代码有问题的地方发出警告

-Idir

将dir目录加入搜索头文件的目录路径

-Ldir

将dir目录加入搜索库的目录路径

-llib

链接lib

-g

在目标文件中嵌入调试信息,以便gdb之类的调试程序调试


编译器并不是把函数模板处理成能够处理任意类的函数

编译器从函数模板通过具体类型产生不同的函数

编译器会对函数模板进行两次编译

在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。


为什么还需要类模板呢?

template <typename T>

class Tclass

{

private: T a;

}


类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如:

   template <class T1,class T2>

   class someclass

   {…};

在定义对象时分别代入实际的类型名,如:

   someclass<int,double> obj;

2) 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。

3) 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。

类模板中的static

Ø  从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员

Ø   和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化

Ø   每个模板类有自己的类模板的static数据成员副本



猜你喜欢

转载自blog.csdn.net/qq_27563511/article/details/80994127