1、所有参数尽量传引用,保证效率,当然如果传的是一两个字节可以传value,同时如果不想改变在前面加上const
返回值在可以的情况下也尽量传reference。如果返回值是在函数体内部创建的,则不可以传引用返回值,因为函数结束后会释放,直接返回一个错误值。
2、相同class的object互为友元。例如
3、能加const尽量加。构造函数写成冒号形式效率更高。
4、return by reference(后续再体会一下)
5、所有class中指针成员的必须有拷贝构造和拷贝赋值,否则会发生浅拷贝,会造成内存泄漏。
拷贝赋值的步骤是先释放自己原本的空间,然后开辟一块新空间,然后赋值,
但是一定要检测是否存在自我赋值,否则在第一步delete的时候会释放掉空间
6、new一个新的复数对象时,编译器转化为三步,使用operator new分配内存,内部调用的是malloc,然后通过类型转换将void* 转换为complex*,最后调用构造函数赋值。
7、在释放掉对象时,和构造相反,是先调用析构函数,再释放指针。
其中在析构函数中要调用delete[]来释放数组,然后再调用operator delete来释放ps指针。之所以要这么做原因是array new一定要搭配array delete,否则会造成内存泄漏。
8、Composition,has-a。
9、转换函数
https://www.cnblogs.com/dishengAndziyu/p/10914348.html
10、模板特化
11、模板偏特化
当然不能跳跃绑定,只能从左到右。
12、模板中使用模板参数
当函数参数数量不定时,可以用可变参数模板来解决,另见知乎所说,如果所有的实参类型相同,可以传递一个名为initializer_list的标准类型,用std::initializer_list<T>做参数;如果实参的类型不同,可以采用一种特殊函数,所谓的可变参数模板。
13、自动类型推导
14、新的遍历方式
和之前的for_each还有iterator不同,这个有点像python里的for i in list,但是需要注意的是如果是传值,那么计算不会影响到原本的容器,使用引用则会改变。
15、引用
将x的地址赋值给p,r代表x,后面r=x2中并不是r又代表x2,而是将x的值也变为5。
16、引用常见用途
引用常见用途就是传参,引用比指针好的点在于使用引用或者值传递调用接口相同,无需改变;引用或者不引用不能成为函数重载的根据,因为调用同一个接口两个函数都会匹配。如果在灰色区域加const,则可以成为函数重载的根据。