怎么介绍自己做的企业网站页面,深圳市住房和建设局局长级别,快速做网站流量数据统计分析,山东seo网页优化外包大家好#xff0c;这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧#xff0c;我们都知道模板嘛#xff0c;就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后#xff0c;对于一些在c中的自定义函数#xff0c;我们在… 大家好这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧我们都知道模板嘛就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后对于一些在c中的自定义函数我们在c中使用就会很方便了。但是因为我们这里只是初识。因为我们现在学识尚浅太过高深的话就一点过载了所以我们这里就暂时交给大家如何辨认和使用简单的模板。
泛型模板 首先我们可以从我们的标题看到我们这一小节讲的是广泛的模板就是使用的范围相对较广但是只是较广并不是通用。我们这里就以我们以前在c中常使用的一个自定义函数swap来说但其实我们在c中就说过我们学习了c就不需要再自己写了也不需要写头文件因为我们c中swap很有可能会被间接包含所以我们通常是直接使用这里我们为了方便教学就以这个为例。 大家都知道我们平常的swap是确定了参数类型的不能不同参数进行交换就像我们下面的图片 在我们c的时候为了应对不同的参数类型所以我们需要写多个参数版本。使用函数重载虽然可以实现但是有一下几个不好的地方
1. 重载的函数仅仅是类型不同代码复用率比较低只要有新类型出现时就需要用户自己增加对应的函数 2. 代码的可维护性比较低一个出错可能所有的重载均出错 那能否 告诉编译器一个模子让编译器根据不同的类型利用该模子来生成代码 呢 如果在 C 中也能够存在这样一个 模具 通过给这个模具中 填充不同材料 ( 类型 ) 来 获得不同 材料的铸件 ( 即生成具体类型的代码 那将会节省许多头发。巧的是前人早已将树栽好我们只 需在此乘凉。 泛型编程编写与类型无关的通用代码是代码复用的一种手段。模板是泛型编程的基础。 函数模板 对于我们的函数模板它代表了一个函数家族该函数模板与类型无关在使用时被参数化根据实参类型产生函数的特定类型版本。已就是说。我们的c模板不会受到参数类型的限制只要我们写的参数个数正确就可以了。虽然我这里很简单说只需要确定参数个数就可以了。但其实也真的很简单。 那么我们就来看看函数的模板是如何书写的。首先我们要先写一个templatetypename T1, typename T2,......,typename Tn 。大体是这样的但是个数就是自己确定。是不是很简单啊。那么我们来写一个swap模板并且看看如何使用的 上面的图片大家可以看到在使用模板前我们先写了一个声明。然后写的我们模板。这里大家是否有留意到我们声明的时候只写了一个参数类型啊就是我们这里templatetypename T中只有一个参数。这就表明了我们这里的模板参数类型只能有一种参数类型。 我想大家看了上面的那句话应该会想到一个疑问吧这就是啥意思啊。上面写了一个参数就代表只有一种参数类型了。那是不是我上面多写几个那么我就可以在模板中使用多种参数类型了呀。但确实是这样的我们可以在声明的时候多些几种那么模板就可以多使用几种那我们来看看例子 这里我们是没有报错的这是因为我们在上面写了两个声明的类型所以我们在模板中可以使用两种参数变量虽然结果可能不尽人意但是我们的却还是确定了一点。我们如果在前面写多个参数那么下面的模板就可以使用多种参数类型。
注括号里面的声明是只能写typename还可以写成clsaa但是大家不要多想以为class可以写那么struct也可以写。这就错了。表明参数类型能个数的就只有这两种表达。没有其他的了
函数模板的原理对于我们学习的人来说主打一个刨根问底。那么我们对于这个函数模板多多少少也是需要了解的。但其实大家如果看到这里了就应该对函数模板的原理也差不多了吧。毕竟我们的标题就写的很清楚了啊。模板嘛。函数模板是一个蓝图它本身并不是函数是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。我感觉有点像一个没有灵魂的人只要有灵魂进入这幅躯体那么这幅躯体就可以凭借这个灵魂带来的思想来完成自己的心愿。就像可以被人随意控制的木偶一样。大家可以看一下下面的图片 这里就有点像我上面写的那个灵魂一样。只要想用就进入这幅空壳凭借这幅躯体就可以做出其他的事情。但如果稍微官方一点的话就是在编译器编译阶段对于模板函数的使用编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如当用double类型使用函数模板时编译器通过对实参类型的推演将T确定为double类型然后产生一份专门处理double类型的代码对于字符类型也是如此。这个大家可以复杂理解也可以简单思考反正我觉得稍微知道是个啥意思就可以了如果深入太多的话就可能有点吃不消了。
函数模板的实例化大家可能看到这个小标题会有点懵。啊。实例化什么个意思怎么会用在这里啊。大家别急。用不同类型的参数使用函数模板时称为函数模板的实例化。模板参数实例化分为隐式实例化和显式实例化。这里我们知道了示例化有两种。一个是显示一个是隐式。那么我们就来先看看显示实例化 我们这里的Add只写了一种参数个数如果按我们前面说的话不是只能有一种参数类型吗这里怎么有两种啊。但大家应该也看到了在我们调用的前面写了一个int。这就好比我们在c中写过的强制类型转换。只是我们写的这里是将这两个全都转换成intint转换为int不变嘛但是我double可以转换为it强制类型转换当然也可以这样写 反正如果我们写的参数个数类型只写了一个的话我们可以将我们不同的参数类型进行转换然后使用。还有对于隐式实例化的话就是比较简单的其实就是我们普通的使用方法也是使用转换就是我们相同的参数类型 这就是我们说的隐式类实例化就是我们平常的使用方法但是对于我们如果想用两种不同的参数类型并且我们的参数类型个数只有一个的话就只能强转或者我们刚刚的显示实例化。 模板参数的匹配原则 不知道大家是否会有一个想法就是因为我们c可以重载函数如果我们创建一个模板然后再创建一个重载函数并且它们的参数是一样的名字是一样的。那如果我调用的话会调用哪一个呢对于这个大家其实可以有一个很简单的想法。例如编译器是一个人的话我其实个人觉得人都是想着少做一点是一点。反正钱拿的是一样的。那为什么我不躺平一点呢以现在的情况为例如果有一个自定义函数的参数类型与模板函数是一样的那么如果调用的话肯定是直接调用使用人写的那个因为如果使用模板函数的话编译器还会自己动一下我干嘛还要自己动呢你反正你已经写了是吧 这里我是简单的用f11调试给大家看的虽然可能大家会怀疑但确实是这样如果当一个非模板函数与模板函数同时调用的话会先调用非模板函数大家知道就可以了。模板函数不允许自动类型转换但普通函数可以进行自动类型转换。
类模板 大家也看到了上面我们所有的文章都是依照函数来写的但是我们c呢肯定不只有函数我们前面学的最多的就是类了我们那也是有模板的。其实对于类的模板格式与我们的函数模板格式相差无几。区别就是我们类的写法我们自定义函数的写法是不一样的。那么我们看一下类模板的定义格式是什么样的
类模板的定义格式
templateclass T1, class T2, ..., class Tn
class 类模板名
{
// 类内成员定义
}; 我们前面说过类模板的第一个是与我们的函数模板格式差不多只是融汇了自己各自的特点。也许大家会想类模板有什么作用呢
一些类主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关如数组类链表类Stack类Queue类等
C中将模板的思想应用于类使得类的实现不关注数据元素的具体类型而只关注类所需要实现的功能。
实现类模板
以相同的方式处理不同的类型在类声明前使用template进行标识 typename T 用于说明类中使用的泛指类型T 这里我们是以我们C中使用过的扩容。大家可能很难看出来但其实我们不看这个我们主要是看我们的模板是如何使用的。后面大家加油以此为蓝本来写也许大家会问啊关于模板函数我们知道的少怎么分析这个类模板函数列
1. 与函数模板不同只能显示指定具体类型无法自动推导。 2. 声明的泛指类型T 可以出现在类模板的任意地方 3. 编译器对类模板的处理方式和函数模板相同 a) 从类模板通过具体类型产生不同的类 b) 在声明的地方对类模板代码本身进行编译 c) 在使用的地方对参数替换后的代码进行编译 大家可以多理解上面分析。并且大家需要知道的一个不能忘的点就是我们类模板的头文件与源文件不能分开。具体是什么原因。在下暂时还不知道。但是我尝试过分开确实会报错的所以大家现在知道不能分开就可以了。 类模板的实例化 类模板实例化与函数模板实例化不同 类模板实例化需要在类模板名字后跟 然后将实例化的 类型放在 中即可类模板名字不是真正的类而实例化的结果才是真正的类 。 // Stack是类名Stackint才是类型
Stackint st1; // int
Stackdouble st2; // double 总结 好的上面这些就是本篇博客想与大家分享的模板的一些相关的基础知识我知道可能大家会很多的不了解尤其是类模板的。相较于函数模板的话类模板确实要有更多的知识点但是大家不要害怕我们可以多稍微多理解几遍看几遍就可以了解的更多了。模板嘛毕竟是我们c中最好用的一个东西啊因为相较于c中它没有我们c有就更好用了。好鄙人在这里祝各位前程似锦