- 浏览: 115420 次
- 性别:
- 来自: 北京
文章分类
最新评论
由 王宇 原创并发布 :
第2章函数模板
2.1初探函数模板
2.1.1定义模板
template<typenameT>
inlineTmax(Tconst&a,Tconst&b){}
class,typename是等价的,推荐使用typename
2.1.2使用模板:函数模板的隐形使用:max(a,b);
具体类型替代模板参数的过程叫做实例化
2.2实参的演绎
调用参数的类型构造自模板参数,所以模板参数和调用参数通常是相关的。我们把这个概念称为:函数模板的实参演绎
max(4,7);ok隐形
max(4,4.2);errorT不能够自动转换
解决办法:
(1)max(static_cast<double>(4),4.2);
(2)max<double>(4,4.2);//显式
(3)指定两个参数可以具有不同的类型
2.3模板参数
template<typenameT>//T模板参数,可以定义多个不同的参数
-----------
template<typenameRT,typenameT1,typenameT2>
inlineRTmax(T1const&a,T2const&b);
max<double>(4,4.2);RT为double,T1为int,T2为double
2.4重载函数模板
对于非模板函数和同名的函数模板,如果其他条件都是相同的话,那么在调用的时候,重载解析过程通常会调用非模板函数,而不会从该模板产生出一个实例
模板是不允许自动类型转化的;但普通函数可以进行自动类型转换,所以最后一个调用将使用非模板函数
inlineintconst&max(intconst&a,intconst&b){}
template<typenameT>
inlineTconst&max(Tconst&a,Tconst&b){}
::max(7,42);//使用非模板函数
::max('a',42.7);//使用非模板函数
第3章类模板
3.1类模板Stack的实现
3.1.1类模板的声明
template<typenameT>//可以使用class
classStack{};
3.1.2成员函数的实现
voidStack<T>::push(Tconst&elem);
3.2类模板Stack的使用
Stack<int>intStack;Stack<std::string>strStack;
Stack<Stack<int>>intStackStack;//Error,>>不允许使用,中间需放入一个空格,>>
3.3类模板的特化
为了特化一个类模板,你必须在起始处声明一个template<>,接下来声明用来特化类模板的类型
template<>
classStack<std::string>{};
3.4局部特化
相同类型:
template<typenameT>
classMyClass<T,T>{};
int参数:
template<typenameT>
classMyClass<T,int>{};
指针类型:
template<typenameT1,typenameT2>
classMyClass<T1*,T2*>
使用:
MyClass<int,float>mif;//MyClass<T1,T2>
MyClass<float,float>mif;//MyClass<T,T>
MyClass<float,int>mif;//MyClass<T,int>
MyClass<int*,float*>mp;//MyClass<T1*,T2*>
3.5缺省模板实参
template<typenameT,typenameCONT=std::vector<T>> classStack{ CONTelems; voidpush(Tconst&elem); }
第4章非类型模板参数
4.1非类型的类模板参数
template<typenameT,intMAXSIZE> claseStack{ if(MAXSIZE>0){}; }
Stack<int,20>intStack;
4.2非类型的函数模板参数
template<typenameT,intVAL>
TaddValue(Tconst&x){returnT+VAL;};
4.3非类型模板参数的限制
不能使用浮点数(double)和类对象,以及全局指针作为模板参数,这是历史原因。
第5章技巧性基础知识
5.1关键字typename
引入关键字typename是为了说明:模板内部的标识符可以是一个类型
template<typenameT> classMyClass{ typenameT::SubType*ptr;//声明一个指针 }
5.2使用this->
对于具有基类的类模板,自身使用名称x并不一定等同于this->x.即使该x是从基类继承获得的
template<typenameT> classBase{ public: voidexit(); }; template<typenameT> classDerived:Base<T>{ voidfoo(){ exit();//Error,应该使用this->exit } };
5.3成员模板
重载操作符=
5.4模板的模板参数
让模板参数本身成为模板是很有用的
template<typenameT,template<typenameELEM>classCONT=std::deque>
5.5零初始化
template<typenameT> voidfoo(){ intx;//error Tx;//error Tx=T();//ok }
5.6使用字符串作为函数模板的实参
template<typenameT>
inlineTconst&max(Tconst&a,Tconst&b){};//可以修改成(Tconsta,Tconstb)//导致无用的拷贝
::max("apple","peach");//OK相同类型,长度一样
::max("apple","tomato");//Error不同类型,长度不同
std::strings;
::max("apple",s);//Error不同类型
无通用的解决办法:
1、使用非引用参数,取代引用参数,导致无用的拷贝
2、进行重载,编写接收引用参数和非引用参数的两个重载函数,这可能会导致二义性
3、对具体类型进行重载
4、强制要求应用程序程序员使用显示类型转换
第6章模板实战
6.1包含模型
6.1.1链接器错误
把模板放在doc-C(cpp)文件中使用,链接器报错,找不到函数,原因是没有被实例化。
6.1.2头文件中的模板
把模板的定义放在头文件中,这种组织方式为包含模式
不足:增加的头文件的开销
6.2显式实例化
由关键字template和紧接其后的我们所需要实例化的实体(可以是类、函数、成员函数等)的声明组成,而且,该声明是一个已经用实参完全替换参数之后的声明
缺点:我们必须仔细跟踪每个需要实例化的实体。对于大项目而言,这种跟踪很快就会带来巨大负担:因此,我们不建议使用这种方式
优点:实例化可以在需要的时候才进行
6.22整合包含模型和显式实例化
6.3分离模型,(不建议使用)
导出模板,这种机制通常也被称为C++模板的分离模型
6.3.1关键字export
6.4模板和内联
对于许多不属于类定义一部分的短小模板函数,你应该使用关键字inline类声明它们
6.5预编译头文件
6.6调试模板
第7章模板术语
7.1“类模板”还是“模板类”
class和struct的唯一区别在于:缺省访问权限:class:private;struct:public.C++推荐class,C推荐struct
7.2实例化和特化
模板实例化是一个通过使用具有值替换模板实参,从模板产生出普通类、函数或者成员函数的过程。这个过程最后获得的实体(譬如类、函数或者成员函数)就是我们通常所说的特化(specialization)
7.3声明和定义
声明:引用了一个名字到某个作用域中
定义:声明并分配内存
7.4一处定义原则
ODR原则:
和全局变量与静态数据成员一样,在整个程序中,非内联函数和成员函数只能被定义一次
类类型和内联函数在每个翻译单元中最多只能被定义一次,如果存在多个翻译单元,则其所有的定义都必须是等同的
7.5模板实参和模板参数
模板参数:位于模板声明或定义内部,关键字template后面所列举的名字
模板实参:用来替换模板参数的各个对象
一个基本原则:模板实参必须是一个可以在编译期确定的模板实体或者值
第14章模板与设计
14.1动多态
继承和虚函数实现的多态
14.2静多态
模板实现的多态
14.3动多态和静多态
通过继承实现的多态是绑定的和动态的
绑定:对于参与多态行为的类型,它们的接口是在公共基类的设计中就预先确定的
动态:接口的绑定是在运行期完成的
通过模板实现的多态是非绑定的和静态的
非绑定:对于参与多态行为的类型,它们的接口是没有预先确定的
静态:接口的绑定是在编译期完成的
与动多态相比,静多态被认为具有更好的类型安全性
14.4新形式的设计模板
14.5泛型程序设计
泛型程序设计定义为运用模板的程序设计,就像面向对象的程序设计被看成是运用虚函数的程序设计
在一个框架中,设计模板的目的是为了能够得到多种有用的组合(类型)
STL实际上是一个框架,它提供了许多有用的操作,我们也把这些操作称为算法;它同时也为对象集合提供了许多线性数据结构,我们把这些数据结构称为容器,而且,算法和容器都是模板。
第15章trait与plicy类
15.1一个实例:累加一个序列
15.1.1fixedtrait
使用模板,实现不同类型(intcharshortfloat)的累加
定义:定义模板,并特化:
template<typenameT> classAccumulationTraits; template<> classAccumulationTraits<char>{ public: typedefcharAccT; }; classAccumulationTraits<int>{ public: typedefintAccT; }; classAccumulationTraits<double>{ public: typedefdoubleAcct; };
实现模板函数:
template<typenameT> AccumulationTraits<T>::AccTaccum(Tconst*beg,Tconst*end){ typedeftypenameAccumulationTrains<T>::AccTAccT;//特化演绎 AccTtotal=Acct(); while(beg!=end){ total+=beg; ++beg; } }
15.1.2valuetrait
-- 缺点:C++只允许我们对整形和枚举类型初始化静态成员变量
15.1.3参数化trait
15.1.4policy和policy类
针对accum()的所有操作,唯一需要改变的只是total+=*beg操作,于是,我们就把这个操作称为该累积过程的一个policy.因此,一个policy类就是一个提供了一个接口的类,该操作能够在算法中应用一个或多个policy
template<typenameT,typenamePlicy=SumPolicy,typenameTraits=AccumulationTraits<T>> classAccum{ public: typedeftypenameTraits::AccTAccT; staticAccTaccum(Tconst*beg,Tconst*end) { Accttotal=Traits::zero(); while(beg!=end){ Policy::accumulate(total,*beg);//this is policy ++beg; } } };
15.1.5trait和policy:区别
trait字面上:用来刻划一个事物的(与众不同)特性
policy字面上:为了某种有益或有利的目的而采用的一系列动作
policy更加注重于行为,而trait则更加注重于类型
实现形式上:
trait是用特化演绎
policy是模板参数
15.2类型函数
15.2.1确定元素的类型
15.2.2确定class类型
15.2.3引用和限定符
15.3policytrait
第16章模板与继承
16.1命名模板参数
16.2空基类优化
16.3奇特的递归模板模式
16.4参数化虚拟性
第17章metaprogram
metaprogramming含有“对一个程序进行编程”的意思,换句话说,编程系统将会执行我们所写的代码,来生成新的代码,而这些新代码才真正实现了我们所期望的功能。(递归模板)
17.1metaprogram的第一个实例
template<intN> classPow3{ public: enum{result=3*Pow3<N-1>::result}; }; template<> classPow3<0>{ public: enum{result=1}; };
Pow3<>模板,包括特化,被称为一个metagrogramming
17.2枚举值和静态常量
staticintconstFour=4;
静态成员变量只能是左值。
17.3第2个例子:计算平方根
17.4使用归纳变量
17.5计算完整性
17.6递归实例化和递归模板实参
17.7使用metaprogram来展开循环
第18章表示式模板
18.1临时变量和分割循环
18.2在模板实参中编码表达式
18.3表达式模板的性能与约束
发表评论
-
深入理解C++11阅读笔记
2018-06-28 14:12 1071编写: 王宇 2017-12-14 一 新标准 ... -
单链表归并排序
2016-09-30 16:20 547单链表归并排序-O(nlogn) 由 王宇 ... -
单链表的增、删、改、查
2015-05-22 11:57 718单链表的增、删、改、查(原创) 由 ... -
Unix 网络编程_阅读笔记四 线程、客户/服务器程序设计范式
2015-03-05 17:32 830Unix 网络编程_阅读笔记 四 (Socket高级篇之线 ... -
Unix 网络编程_阅读笔记三 广播、多播、UDP套接字、信号驱动式I/O
2015-03-05 16:10 1588Unix 网络编程_阅读笔 ... -
Unix 网络编程_阅读笔记二 守护进程和高级I/O
2015-03-05 15:25 1001Unix 网络编程_阅读笔记 二 (Socket高级篇之守 ... -
Unix 网络编程_阅读笔记一 Socket基础篇
2015-02-10 17:01 997Unix 网络编程(阅读笔记 一Socket基础篇) - ... -
在C语言环境下,编写自己的Vector容器。
2014-04-28 17:22 6838在C语言环境下,编 ... -
红红纪念日记录器(原创)
2014-04-04 14:17 1153红红纪念日记录器(原创) ... -
深度探索C++对象模型-- Data 语意学(阅读笔记)(原创)
2014-02-18 16:05 1463深度探索C++对象模型(阅读笔记)(原创) Inside ... -
深度探索C++ 对象模型--构造函数语意学(阅读笔记)(原创)
2013-10-10 16:17 1307深度探索C++ 对象模型(阅读笔记)(原创) Insid ... -
深度探索C++ 对象模型--关于对象(阅读笔记)(原创)
2013-09-26 15:07 1559... -
eSpeak 安装部署记录(原创)
2013-04-22 16:13 3628eSpeak安装部署记录(原创) 由 ... -
基础算法总结(原创)
2012-07-12 21:13 996基 础 算 法 总 结(原创) 由 王宇 ... -
C++ GUI Qt4编程--阅读笔记(原创)
2012-06-10 17:19 2652C++ GUI Qt4编程--阅读笔记(原创) ... -
C缺陷和陷阱--阅读笔记(原创)
2012-05-26 21:27 1086由 王宇 原创并发布 : 第1章词法陷阱 ... -
Effective C++--阅读笔记(原创)
2012-05-26 21:06 1292由 王宇 原创并发布 ...
相关推荐
STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了高效且灵活的数据结构和算法。这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的...
C-C++基础学习笔记是编程初学者的重要参考资料,它们涵盖了C和C++语言的基本概念、语法和编程技巧。以下是对这些知识点的详细说明: 1. **C语言基础**:C语言是一门强大的低级编程语言,它以简洁、高效著称。学习...
《千锋C++笔记》是一份综合性的学习资料,涵盖了C++编程语言的基础到高级概念。这份笔记由知名教育机构“千锋”提供,旨在帮助初学者和有一定基础的程序员深入理解和掌握C++这一强大的系统级编程语言。下面将详细...
**C++学习笔记--函数** 在C++编程中,函数是一种可重用的代码块,它执行特定的任务并可能接收参数、返回值或两者都有。本笔记将深入探讨C++中的函数,包括它们的定义、调用、参数传递以及如何在实际编程中有效地...
5. **STL(Standard Template Library)**:STL是C++的标准库,包含容器(如vector、list、set等)、迭代器、算法和函数对象,为程序员提供了高效的数据结构和算法。 6. **异常处理**:C++提供了异常处理机制,通过...
通过阅读这些笔记,读者可以逐步深化对C++的理解,从基础知识到高级特性,再到实际应用,全面掌握C++的编程技能。每份文件都是一次深入学习的机会,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅。不断探索...
标题"Cpp.rar - C++学习笔记"暗示了这份压缩包可能包含一系列关于C++的学习资料,比如笔记、代码示例或者教程。这些笔记可能会涵盖C++的基础语法、类与对象、模板、异常处理、STL(标准模板库)、内存管理等方面。...
这份笔记结合了书本内容的摘录和作者个人的理解,其中包含了7章原创内容以及14章从CSDN网站上整理摘抄的部分,这些章节可能有所重叠,但无疑为学习者提供了丰富的资源。 C++模板是C++语言中的一个强大工具,它允许...
《C/C++开发实战笔记》是一本专注于C/C++编程实践和学习心得的资料,旨在帮助初学者和有经验的开发者巩固基础知识,提升实战技能。作者通过自身的学习历程和编程经验,提炼出了一系列的关键知识点,涵盖了C/C++语言...
《达内学生C++学习笔记》是一份专为初学者设计的C++教程,旨在提供清晰易懂、逐步深入的学习路径。...通过阅读和实践这些笔记,读者可以期待在C++编程领域打下坚实的基础,为未来深入学习和开发项目做好准备。
接着,笔记会介绍模板和STL(Standard Template Library,标准模板库)。模板是C++中实现泛型编程的关键工具,它允许我们编写可以应用于多种数据类型的代码。STL是一组预先编写好的高效容器(如vector、list、set等...
【C++读书笔记】 在深入理解C++的过程中,读书笔记是一种有效的...文件列表中的“莫言作品集”等CHM文件似乎与C++主题不符,可能是上传时的误放,不过对于C++的学习来说,阅读和理解相关的专业书籍和资料同样重要。
【达内C++课程笔记】是一份全面涵盖了C++编程语言以及相关技术的教程资源,由达内科技提供。这份笔记不仅包含C++的基础知识,还深入探讨了C++的高级特性和实际应用,旨在帮助学习者从入门到精通,掌握C++编程技能。 ...
- **STL(Standard Template Library)**:深入理解容器、迭代器、算法的使用,以及自定义比较函数和迭代器适配器。 在学习过程中,不断实践和编写代码是巩固知识的关键。通过编写小程序、解决实际问题来加深对C++...
《Visual C++程序设计学习笔记》是一份深入探讨C++编程在Microsoft Visual Studio环境下的实践指南。这份笔记涵盖了从基础知识到高级技术的广泛内容,旨在帮助读者熟练掌握Visual C++的使用,提升软件开发能力。 一...
最后,【C++学习笔记【原创】】可能还会涉及一些高级主题,如模板(template)、内存管理(动态分配和释放内存)、预处理器宏、命名空间(namespace)以及C++11及后续标准引入的新特性,如右值引用(rvalue ...
本笔记详细记录了从入门到精通C++的学习过程,旨在帮助任何级别的学习者都能稳步提升。 一、C++基础 C++的基础部分涵盖了变量、数据类型、运算符、控制结构(如if语句、switch case、循环)、函数、数组和指针等。...
本资源包含的是Visual C++程序设计的学习笔记,涵盖了从基础到进阶的12个章节的源代码,对于学习和理解C++编程,特别是使用Visual C++环境编程,具有极高的参考价值。 首先,我们来详细探讨一下Visual C++的关键...
【C++全程笔记+代码全套】是一份涵盖了达内教育91天全程C++课程的精华资料,旨在帮助学习者深入理解和掌握C++这门强大的编程语言。这份资源包括了详细的笔记和完整的代码示例,是提升C++编程技能的理想学习材料。 ...
6. **第6阶段实战-基于STL泛化编程的演讲比赛资料**:STL(Standard Template Library,标准模板库)是C++的核心部分,包含容器(如vector、list、set)、迭代器、算法等,此阶段将介绍如何使用STL进行泛型编程,并...