侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! !
一、C++ 面向对象高级开发
1、C++面向对象高级编程(上)
2、C++面向对象高级编程(下)
二、STL 标准库和泛型编程
1、分配器、序列式容器
2、关联式容器
3、迭代器、 算法、仿函数
4、适配器、补充
三、C++ 设计模式
四、C++ 新标准
五、C++ 内存管理机制
六、C++ 程序的生前和死后

一、C++面向对象高级编程(下) (侯捷)

泛型编程(Generic Programming)(模板) 和面向对象编程(Object-Oriented Programming)虽然分属不同思维,但它们正是C++的技术主流;

深入探索面向对象之继承关系(inheritance)所形成的对象模型(Object Model),包括隐藏于底层的 this 指针,vptr(虚指针),vtbl(虚表),virtual mechanism(虚机制),以及虚函数(virtual functions)造成的polymorphism(多态)效果。

1、转换函数没有返回类型,没有传入参数,后面应该加const

2、类模板 class template,使用的时候要说明类型

template<typename T>
class complex
{public:complex( T r = 0,T i = 0): re (r), im (i){ }comp1ex& operator+=(const complex&);T real () const { return re; }T imag () const { return im; }private:T re,im ;friend complex& _doapl (complex* , const complex&);
};

使用:

{complex<double>c1(2.5,1.5);complex<int> c2(2,6);...
}

3、函数模板function template,使用的时候不需要说明类型,编译器会对function template进行实参推导。

class stone
{public:stone(int w,int h, int we): _w ( w ),_h (h), _weight (we){}bool operator<(const stone& rhs) const { return _weight < rhs._weight; }private:int _w, _h,_weight;
};template <class T>
inline
const T& min (const T&a, const r& b)
{return b < a ? b : a ;
}

使用:

stone r1(2,3), r2(3,3), r3;
r3 = min(r1, r2);

4、成员模板 member template ,模板里面嵌套着其他模板

template <class T1,class T2>
struct pair{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair (): first(T1()) , second(T2()) { }pair (const T1& a, const T2& b): first(a) , second(b) { }template <class U1, class U2>pair (const pair<U1, U2>& p): first(p.first) , second(p.second) { }     //把初值的头尾放进来,放入本身的头尾//把子类赋给对应的父类,up-cast
};

5、specialization,模板特化

template <class Key>//泛化
struct hash { };//特化
template<>
struct hash<char> {size_t operator () (char x) const { return x; }
};template<>
struct hash<char> {size_t operator () (int x) const { return x; }
};template<>
struct hash<char> {size_t operator () (long x) const { return x; }
};

6、template template parameter,模板模板参数

template<typename T, template <typename T>class Container//容器>
class xCls
{private:Container<T> c ;
public:...
} ;
template<typename T>
using Lst = list<T,allocator<T>>;

使用:

xCls<string, list> mylst1;             //错误
xc1s<string, Lst> mylst2;         //正确

7、variadic templates (since C++11) 数量不定的模板参数

void print()//没有参数的时候调用这个
{}template<typename T, typename... Types>// ...表示一包
void print(const T& firstArg, const Types&... args)
{cout << firstArg << endl;print(args...);//一直调用本身,直到没有参数,调用上面的print()
}

想要知道后面的一包有多少个,可以使用 sizeof...(args)

…就是一个所谓的 pack(包)
用于 template parameters,就是template parameters pack (模板参数包)
用于function parameter types,就是function parameter types pack (函数参数类型包)
用于function parameters,就是function parameters pack (函数参数包)

8、智能指针 auto (since C++11)

list<string>c;
...
list<string>::iterator ite ;
ite = find(c.begin(), c.end(), target);

可以写成:

list<string>c;
...
auto ite = find(c.begin(), c.end(), target);//赋值的时候,auto 会自动推出类型//声明变量的时候不能使用auto, 推不出来类型

9、ranged-base for (since C++11)
例如:

for (int i : {2, 3, 5, 7, 9, 13, 17, 19}){cout<< i << endl;
}vector<double> vec;
...
for ( auto elem : vec ) {//pass by valuecout <<elem <<endl;
}
for ( auto& elem : vec ) {//pass by referenceelem *= 3;
}

10、reference

int x = 0;
int* p = &x;
int& r = x;     //r代表(别名)x,现在r,x都是0
int x2 = 5;r = x2;         // (❌错误),r不能重新代表其他变量,相当于是x的一个别名。现在 r,x 都是5
int& r2 = r;    //现在r2是5 (r2代表r,亦相当于代表×)

注意∶object 和 reference 的大小相同,地址也相同(全是假象!)
1、sizeof( r) = sizeof(x)
2、&x = &r ;

Java里面所有的变量都是reference

reference 通常不用于声明变量,而用于参数类型(parameter type)和返回类型(return type)的描述。

以下被视为 “same signature”(所以二者不能同时存在):

11、函数继承的调用权,不是继承他的内存的大小。

12、vptr 虚指针和 vtbl 虚表


动态绑定必须满足三个条件,(而静态绑定一定调用到某个地址。),实现 多态

  1. 必须是用指针来调用,如上面的 p 指针;
  2. 这个指针是向上转型的(祖先);
  3. 调用的是虚函数

每种形状的图形都有自己的虚函数 draw()

13、this指针,动态绑定

一、C++面向对象高级编程(下) (侯捷)相关推荐

  1. 【C++】侯捷C++面向对象高级编程(下)

    转换函数(conversion function) 可以把"这种"东西,转化为"别种"东西. 即Fraction --> double class Fra ...

  2. 侯捷C++学习记录-面向对象高级编程下

    本章谈到三大函数.stack堆.heap栈和内存管理. new 操作 与 delete 操作,最后对String类实现进行复习. 学习static 关键字及类模板涉及到的设计模式有:单例模式.Adap ...

  3. C++面向对象高级开发(侯捷)——堆、栈与内存管理

    stack(栈),heap(堆) Stack:是存在于某作用域(scope)的一个内存空间(memory space).例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,返回地址 ...

  4. 一、C++面向对象高级编程(上) (侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一.C++ 面向对象高级开发 1.C++面向对象高级编程(上) 2.C++面向对象高级编程(下) 二.STL 标准库和泛型编程 1.分配器 ...

  5. 侯捷C++课程笔记02: 面向对象高级编程(下)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(下) pdf版本笔记的下载地址: 笔记02_面向对象高级编程(下),排版更美观一点(访问密码:3834) 侯捷C++课程笔记02: 面向对象高 ...

  6. 侯捷C++视频笔记——C++面向对象高级编程(下)

    C++面向对象高级编程(下) 01.简介 学习目标: 1.探讨上篇没有探讨过的问题 2.继续深入了解面向对象,包括虚指针,虚表,虚函数,以及多态 02.转换函数与explicit 1.转换函数 转换函 ...

  7. 侯捷C++课程笔记01: 面向对象高级编程(上)

    本笔记根据侯捷老师的课程整理而来:C++面向对象高级编程(上) pdf版本笔记的下载地址: 笔记01_面向对象高级编程(上),排版更美观一点(访问密码:3834) 侯捷C++课程笔记01: 面向对象高 ...

  8. 侯捷老师-02面向对象高级编程

    侯捷老师-02面向对象高级编程 1.Static使用 Static本质 Static使用 Static使用举例-单例模式 Static使用举例-单例模式(改进) 2.模板使用 Class Templa ...

  9. 侯捷老师-01面向对象高级编程

    侯捷老师-01面向对象高级编程 01面向对象高级编程 1.编程习惯 总结 2.三大函数 2.1 拷贝构造函数.拷贝赋值函数.析构函数(带有指针的类) 2.2 构造函数.析构函数 局部变量.全局变量 3 ...

最新文章

  1. 未老先呆,这锅熬夜真的要背:生物钟影响阿尔茨海默症的机制被发现
  2. js密码强度正则表达式_这20个正则表达式,能让你少写100行代码
  3. bookstrap 怎么用ajax,bootstrap里怎么用ajax请求数据到table里
  4. Nginx的负载均衡 - 保持会话 (ip_hash)
  5. php奇数乘法表,PHP九九乘法表
  6. mac怎么合并两个容器_看苹果表演黑魔法:macOS Catalina 文件和硬盘出现两个
  7. 小黑框如何连接mysql_珍藏版(cmd小黑框)数据库命令及操作
  8. 1288:三角形最佳路径问题-2019-07-04
  9. mysql数据库varchar_MySQL数据库char与varchar的区别分析及使用建议
  10. Oracle11g:分区表数据操作出现ORA-14400异常处理
  11. 手工收集awr报告_一个Oracle小白的AWR报告分析(一)
  12. 超越java jb51_.net mvc超过了最大请求长度的解决方法
  13. 关于visio 2007导入独立图库
  14. nbu 7.5备份oracle,NBU7.5备份oracle
  15. C/C++ 根据年月日计算星期几——蔡勒公式篇
  16. imo CEO乔月猛:我们是史上研发投入最大的创业团队
  17. 服务器藏宝系列,区如其名,这个服务器里果然遍地都是宝藏
  18. 写任务,列清单-4D工作法
  19. java毕业设计免税商品优选购物商城设计mybatis+源码+调试部署+系统+数据库+lw
  20. 不懂优雅停机,搞挂了线上服务该咋办?

热门文章

  1. 【视频】极值理论EVT与R语言应用:GPD模型火灾损失分布分析
  2. 彷徨 | HBase的详细介绍(概念以及特性)
  3. TD-SCDMA介绍
  4. C语言 | 算法 | BFS
  5. 技术栈中的爱马仕?Facebook发布全新JavaScript引擎:Hermes
  6. 大型网站数据库优化及浅析大型网站的架构
  7. WampServer修改MySQL密码
  8. 上课第一天初感。。。
  9. 解锁工具Unlocker试用
  10. ora-01128,ora-00275