博览网C++课程 第四周

1 导读

课程内容:

 

泛型编程(Generic Programming)和面向对象编程(Object-Oriented Programming)是C++的两大技虚术主流。

 

审图继承关系(Inheritance)所形成的对象模型(Object Model),包括底层的this指针,vptr(虚指针),vtble(虚表),virtual mechanism(虚机制),virtual functions(虚函数)造成的polymorphism(多态)效果。

 

2 Conversion Function 转换函数

转换函数CoversionFunction

例如分数,既可以有“分子分母”形式,由可以有“小数”形式。



需要使用小数形成进行计算时,编译器会使用黄色部分的函数;

Fraction f(3, 5); //5分之3

double d = 4 + f; //此时编译器将使用转换函数double0.6

 

转换函数固定形式:加operator、无返回值、通常有const。

 

3 non-explicit one argument constructor

绿色部分,第二个参数有默认值,构造时给一个参数即可。



当使用f+4时,编译器会自动选择构造函数将4填入构造函数的第一个参数(形成1分之4)。这样就可以完成了分数加整数的语句了。

 

但是当黄色绿色部分都存在时:



编译执行f+4的动作时就会产生歧义(ambiguous),不知如何选择。

 

 

添加explicit关键字,一个明确的构造函数:



此时f+4,编译器不会将4自动转换为1分之4。

 

 

4 pointer-like classes

将一个类设计成指针(设计一个class模拟pointer),这样这个类像指针但又比指针多了很多功能。智能指针。

这样需要重载运算符“*”和“->”。


 

迭代器也是一种智能指针:


 

标准库中的链表模型如下:


构建迭代器基本原理如下:


 

5 Function-like classes

设计一个类,模拟,像一个函数,仿函数。

重写括号“()”。

标准库里面有很多仿函数,重载小括号。同时继承了一些父类。

 

6 namespace经验谈

A设计的函数可能会和B开发出来的函数名字相同了,这样需要命名空间。



无需费劲心思的给函数和变量起名。

同时可以划分全局函数,全局变量等。

 

7 class template

类模板。使用时制定类型。

 

8 Function Template

类模板在使用的时候需要制定类型,函数模板不需要。因为编译器会做一个动作叫Argument Deduction 实参推导。

9 Member Template

任意类(模板或非模板)可以拥有本身为类模板函数模板的成员,这种成员称为成员函数模板。

 

10 Specialization

特化,在类的设计时,如果使用模板,对于某些特殊的类型需要特殊处理时,需要进行泛化相反的动作,特化。

 

举例,如果要特殊处理char这个类型:


 

11 模板偏特化

偏特化(局部特化):个数上的偏,范围上的偏。

个数上偏特化:只指定bool一个类型,第二个Alloc使用模板默认值。


范围上偏特化:使用T定义一个类,再使用T*定义相同的一个类。

 

12 模板模板参数

黄色部分:模板里面的参数本身还是个模板。



容易有第二参数,经常不写,因为有默认值。

 


只有在符号“<>”内部,typename和class含义相同。


 

 

 

13 关于C++标准库

C++标准库提供给用户的是数据结构、容器、算法等等。


 

对于C++,任何编译器都要有一个值就是“__cplusplus”,可以打印出来查看版本。


14 三个主题

C++11的版本迭代器定义有了进化,因为此时编译器能够推测出“ite”的类型,所以第三中情况错误,因为编译器在读到“auto ite”时,推测不出类型:


 

C++11优化了便利时 的语法:


一行语句直接for循环便利“{…}”容器内的元素。


C++112.0的三个主题“VariadicTemplates可变模板”、“auto类型”、“新的for循环”。

 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值