【C++】非类型模板参数 1,浮点数,字符串,以及自定义类型不能作为非类型模板参数(其实非类型模板参数的设计就是解决数组大小这种问题的)非类型形参:用一个常量作为类(函数)模板的一个参数,在类(模板)中可将该参数作为一个常量来使用。类型形参:出现在模板参数列表中,跟在class或者typename后面的参数类型名称。非类型模板参数是一个常量,在显示实例化时传入变量会报错。2,非类型模板参数必须在编译时就能确认结果。模板形参分为类型形参和非类型形参。
【C++】模板的特化 比如,在比较两个数的大小时,如果传入两个变量的指针,那么可能会得到错误的结果。此时我们的期望是比较指针所指向的内容的值,那么就需要模板的特化了。通常情况下,使用模板可以实现一些与类型无关的代码,但是有一些类型需要特殊处理,否则可能会得到一些错误的结果。此时,就需要对模板进行特化。即在原模板的基础上,针对特殊类型进行特殊化的实现方式。全特化是将类模板参数列表中所有参数都进行特化。模板的特化又分为函数模板特化和类模板特化。
【C++】继承 继承机制是面向对象程序设计使代码可以复用最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前所接触的复用都是函数复用,继承是类设计层次的复用。继承基类成员访问方式的变化基类private成员在派生类中不管以什么方式继承都是不可见的如果要基类成员在类外不能被访问,但是在派生类中可以被访问,就定义为protected。
【C++】多态 多态是不同继承关系的对象,去调用同一函数,产生了不同的行为。比如,Student和Soilder继承了Person。Person对象买票全价,Student对象买票半价,Soilder对象买票优先。那么在继承中构成多态需要两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类需对基类的虚函数进行重写。
【C++11新特性】右值引用和移动语义 为了更好地解决问题,这里需要借助一个深拷贝的类,下面模拟实现了一个简化版的string类。右值引用和万能引用的区别就是,右值引用需要的是确定的类型,而万能引用是根据传入实参的类型进行推导,如果传入的实参是一个左值,那么这里的形参t就是左值引用,如果传入的实参是一个右值,那么这里的形参t就是右值引用。移动赋值是一个赋值运算符重载函数,该函数的参数是右值引用类型的,移动赋值也是将传入右值的资源窃取过来,占为己有,这样就避免了深拷贝,所以它叫移动赋值,就是窃取别人的资源来为自己赋值的意思。
【C++11新特性】lambda表达式 的方式捕捉变量时,编译器也不一定会把父作用域所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来,这个主要看编译器的具体实现。这样一来,调用lambda表达式时就不用传入参数了,但实际我们只需要用到变量a和变量b,没有必要把父作用域中的所有变量都进行捕捉,因此也可以只对父作用域中的a、b变量进行捕捉。但由于这里是传值捕捉,lambda函数中对a和b的修改不会影响外面的a、b变量,与函数的传值传参是一个道理,因此这种方法无法完成两个数的交换。
【C++11新特性】可变参数模板 模板参数Args前面有省略号,代表它是一个可变参数模板,我们把带省略号的参数称为参数包,参数包里面可以包含0到N(N>=0)个模板参数,而args则是一个函数形参参数包。模板参数包Args和函数形参参数包args的名字可以任意指定。现在调用ShowList函数时就可以传入任意多个参数了,并且这些参数可以是不同类型的。我们可以在函数模板中通过sizeof计算参数包中参数的个数但是我们无法直接获取参数包中的每个参数,只能通过展开参数包的方式获取,这是使用可变参数模板的一个主要特点,也是最大的难点。
【C++】继承 继承的概念继承机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,而继承便是类设计层次的复用。例如,以下代码中Student类和Teacher类就继承了Person类。// 父类public:protected:string _name = "张三";// 子类protected:int _stuid;
【C++11新特性】function包装器 function包装器是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。Ret:被包装的可调用对象的返回值类型。Args…:被包装的课调用对象的形参类型。包装示例function包装器可以对可调用对象进行包装,包括函数指针(函数名)、仿函数(函数对象)、lambda表达式、类的成员函数。public:class Pluspublic:int main()// 1、包装函数指针(函数名)
【C++】文件IO流 C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从计算机内部向外部输出设备(如显示器)输出的过程。“流”是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且有方向性的数据的抽象描述。注意: 可以在定义文件流对象的同时指定将要打开的文件名,以及文件的打开方式。使用 >> 和
【Linux】多路转接 -- select函数 多路转接也叫多路复用,是一种用于管理多个IO通道的技术。它能实现同时监听和处理多个IO事件,而不是为每个IO通道创建单独的线程或者进程,多路转接允许在单个进程或线程中同时处理多个IO操作,从而提高程序的性能和效率。本篇文章介绍的select函数,就用于select系统调用的多路转接技术。select函数是系统提供的一个多路转接接口。IO = 等待就绪 + 数据拷贝,而select是只负责等。参数说明:参数timeout的取值:返回值说明:select调用失败,错误码可能被设置为:fd_set 结构与 si
【MySQL】内置函数 对于多字节字符来说,不同编码中一个字符所占的字节个数是不同的,比如utf8中一个字符占用3个字节,而gbk中一个字符占用2个字节。strcmp函数用于逐字符按照ASCII码比较两个字符串的大小,两个字符串大小相等返回0,前者大返回1,后者大返回-1。现有如下成绩表,要求以“XXX的语文是XX分,数学是XX分,英语是XX分”的格式显示成绩表中的信息。substring函数用于从字符串的指定位置开始,向后截取指定个数的字符。left函数用于从字符串的左边开始,向后截取指定个数的字符。
【MySQL】表的增删查改 通常情况下不建议使用 * 进行全列查询,因为被查询到的数据需要通过网络从MySQL服务器传输到本主机,查询的列越多也就意味着需要传输的数据量越大,此外,进行全列查询还可能会影响到索引的使用。在select的column列表中指明要查询的列为姓名、数学成绩、英语成绩和语文成绩,在order by子句中指明依次按照数学成绩排降序、英语成绩排升序和语文成绩排升序。再向表中插入一些数据,在插入数据时不指明自增长字段的值,这时会发现插入数据对应的自增长id值是在之前的基础上继续增长的。
Reactor网络模式 可以在当前服务器的基础上接入线程池,当recver回调读取完数据并完成报文的切割和反序列化之后,就可以将其构建成一个任务然后放到线程池的任务队列中,然后服务器就可以继续进行事件派发,而不需要将事件耗费到业务处理上面,而放到任务队列当中的任务,则由线程池当中的若干个线程进行处理。下一次Dispatcher在进行事件派发的时候就会帮我们关注该套接字的写事件,当写事件就绪就会执行该套接字对应的EventItem结构中的写回调方法,进而将outbuffer中的响应数据发送给客户端。
【MySQL】数据类型 而如果是无符号float类型得到取值范围,实际就是把对应有符号float类型中的负数部分全部拿走了,因此float(4,2)的取值范围为0 ~ 99.99,实际可插入的范围为0 ~ 99.994。
【MySQL】数据库基础 数据库是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。存储数据用文件就可以了,为什么还要弄个数据库呢?文件的安全性问题:数据误操作之后无法进行回退文件不利于数据查询和管理:没有将存储的数据以某种数据结构组织起来文件不利于存储海量数据:数据量越大用户操作数据的成本越高文件在程序中控制不方便:数据的控制需要用户自己来完成总之,文件虽然确实提供了数据的存储功能,但是文件并没有提供非常好的数据管理能力。
【MySQL】数据库的基本操作 表恢复之前需要先选中一个数据库,表明需要将表恢复到哪一个数据库中去,为了防止恢复出来的表与该数据库中已有的表的表明恢复,一般在恢复表时会选择创建一个空的数据库,然后在该数据库中进行表的恢复。使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8_general_ci校验规则在比对数据时是不区分大小写的,而utf8_bin校验规则在对比数据时则是区分大小写的。如果没有对MySQL的配置文件进行过修改,那么默认的编码格式是utf8,默认的校验规则是utf8_general_ci。
【Linux】多路转接 -- epoll struct epoll_event结构当中有两个成员,第一个成员events表示的是需要监听的事件,第二个成员data是一个联合体结构,一般选择使用该结构当中的fd,表示需要监听的文件描述符。epoll_ctl 函数用于向指定的epoll模型中注册事件,它不同于seletct()的一点就是,select在监听事件时告诉内核要监听什么类型的事件,而它是先注册要监听的事件类型。epoll的高性能,是有特定的场景的,如果场景选择不合适,epoll的性能可能适得其反。