萌新向,C++模板之我见

初学C++,发一个对模板的看法,希望有大牛对于文中理解不足之处予以直接了断的方式斧正,谢谢!


首先是对模板的整体理解,模板实际上就是对编程时的一个简化开发,和功能的扩充,模板声明本身更像是一个说明符,表明了这个函数/类应该使用某些参数来对其进行实例化,实例化则更像是一个代码复用创建的过程,由于基本操作大部分没有变动,所以只是对其中的一些操作以相应类型特定的操作来进行替换,从而生成特定的操作。


为了证明以上论点,就顺带把模板的整个操作和规则都例举出来了:

1:

模板参数定义时不可为空,除非在显式实例化的时候,但是显式实例化通常空的参数表可以直接省略只留一个template的,因为这里表明了我们将对所有的模板参数进行表明,而对于类的部分特例化则需要模板参数列表并且模板参数是那个没有明确的类型指明的

2:

要注意,模板只是一个说明符,说明这个类中的类型参数要用模板推断出来(显式传递)的参数类型进行替换并生成一组专门的定义(也就是实例化)

3:

要注意,模板的生成时在编译之前的预编译期实现的,即在连接之前就把所有需要的实例创建好(也就是在#define 替换的同个时期)所以通常模板的声明和定义都是在头文件中进行的(因为#include 的作用是将其中内容潜入源文件中的),所以这样是可行的

4:

紧跟上一点,由于#include是将头文件的内容嵌入源文件中的所以每次我们在不同源文件实例化的类或者函数则会单独创建,所以此时就可以要求进行显式实例化,即在一个源文件内实例化之后,其他源文件通过这个声明得知其他源文件有这个声明就不会对其额外进行声明了。

5:

模板的实例化是一个使用即创建的规则,更具带有模板说明符的那个基本模板(这个才是模板的模板啊!)进行修改和创建代码,之后进行编译,所以对于一个类模板来说使用到的成员才会被创建为一个新的实例,因为这并不影响一个新的类的创建(如果出现嵌套使用的情况下,那这个成员函数也是被使用的,也就是说也是要被创建的),所以整体不影响创建一个新的类,所以如果在模板中某个类的某个操作不被支持,只要在写程序时注意不要调用相关的函数就好。

6:

结合4,5这里要注意,对于一个显式实例化的模板,所有的成员都将被创建,此时5中最后的那个点会出错。

7:

每个实例化的类都是互不相同的,所以这里的静态成员和友元的声明都是要注意的,静态成员对每个实例都有一个但是静态成员同样遵循之前的使用到才被实例化的原则,友元可以是一对一,多对一,一对多的情况,也就是说我们在声明友元的时候可以用当前类型的模板参数指定如果那个类使用相同类型实例化时那个类就是该类的友元,一对多则是直接对于另外一个类的所有实例都是友元关系,多对一则是指定明确了类型的一个友元声明,这里要注意的是,对于一个友元的声明,通常在全局,中前两种对应方式都明确了其模板参数的类型(第一种算是一种特殊的指定)那么此时我们就需要在此之前知道模板参数的数量,唯一的方式就是全局声明一下,这里的声明就很讲究了,直接用typename来表示里面的模板参数就好,和函数声明类似,但是这里要注意和显式实例化的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值