侯捷C++面向对象高级开发笔记

 

1、所有参数尽量传引用,保证效率,当然如果传的是一两个字节可以传value,同时如果不想改变在前面加上const

返回值在可以的情况下也尽量传reference。如果返回值是在函数体内部创建的,则不可以传引用返回值,因为函数结束后会释放,直接返回一个错误值。

2、相同class的object互为友元。例如

 

侯捷C++面向对象高级开发笔记_第1张图片

3、能加const尽量加。构造函数写成冒号形式效率更高。

4、return by reference(后续再体会一下)

侯捷C++面向对象高级开发笔记_第2张图片

5、所有class中指针成员的必须有拷贝构造和拷贝赋值,否则会发生浅拷贝,会造成内存泄漏。

侯捷C++面向对象高级开发笔记_第3张图片

拷贝赋值的步骤是先释放自己原本的空间,然后开辟一块新空间,然后赋值,

侯捷C++面向对象高级开发笔记_第4张图片

但是一定要检测是否存在自我赋值,否则在第一步delete的时候会释放掉空间

侯捷C++面向对象高级开发笔记_第5张图片

6、new一个新的复数对象时,编译器转化为三步,使用operator new分配内存,内部调用的是malloc,然后通过类型转换将void* 转换为complex*,最后调用构造函数赋值。

侯捷C++面向对象高级开发笔记_第6张图片

7、在释放掉对象时,和构造相反,是先调用析构函数,再释放指针。

侯捷C++面向对象高级开发笔记_第7张图片

其中在析构函数中要调用delete[]来释放数组,然后再调用operator delete来释放ps指针。之所以要这么做原因是array new一定要搭配array delete,否则会造成内存泄漏。

侯捷C++面向对象高级开发笔记_第8张图片

8、Composition,has-a。

侯捷C++面向对象高级开发笔记_第9张图片

9、转换函数

侯捷C++面向对象高级开发笔记_第10张图片

https://www.cnblogs.com/dishengAndziyu/p/10914348.html

侯捷C++面向对象高级开发笔记_第11张图片

10、模板特化

侯捷C++面向对象高级开发笔记_第12张图片

11、模板偏特化

侯捷C++面向对象高级开发笔记_第13张图片

当然不能跳跃绑定,只能从左到右。

侯捷C++面向对象高级开发笔记_第14张图片

12、模板中使用模板参数

侯捷C++面向对象高级开发笔记_第15张图片

侯捷C++面向对象高级开发笔记_第16张图片

侯捷C++面向对象高级开发笔记_第17张图片

当函数参数数量不定时,可以用可变参数模板来解决,另见知乎所说,如果所有的实参类型相同,可以传递一个名为initializer_list的标准类型,用std::initializer_list做参数;如果实参的类型不同,可以采用一种特殊函数,所谓的可变参数模板。

13、自动类型推导

侯捷C++面向对象高级开发笔记_第18张图片

14、新的遍历方式

侯捷C++面向对象高级开发笔记_第19张图片

和之前的for_each还有iterator不同,这个有点像python里的for i in list,但是需要注意的是如果是传值,那么计算不会影响到原本的容器,使用引用则会改变。

15、引用

侯捷C++面向对象高级开发笔记_第20张图片

将x的地址赋值给p,r代表x,后面r=x2中并不是r又代表x2,而是将x的值也变为5。

16、引用常见用途

侯捷C++面向对象高级开发笔记_第21张图片

引用常见用途就是传参,引用比指针好的点在于使用引用或者值传递调用接口相同,无需改变;引用或者不引用不能成为函数重载的根据,因为调用同一个接口两个函数都会匹配。如果在灰色区域加const,则可以成为函数重载的根据。

你可能感兴趣的:(笔记)