1、函数参数传递优先使用传引用,而不是传值
①、函数参数传递的过程是赋值的过程,对象之间赋值是会产生赋值运算符的重载调用,退出函数时还会再调用一次析构函数,传引用就不存在上述函数调用
2、函数返回一个临时对象时,应该直接返回,而不应该先定义一个临时对象,然后返回定义的临时对象;
①、定义一个临时对象会产生构造函数,函数返回临时对象会在主调函数栈空间生成一个临时对象,这个时候会调用拷贝构造函数,接下来就会析构第一个临时对象,一大堆函数调用
②、直接返回临时对象,相当于用一个临时对象生成另外一个临时对象A a = A(10);编译器直接优化成,只生成临时对象a , 假如不优化:1、先调用构造函数生成临时对象A(10),然后调用拷贝构造函数生成 A a,最后出了该语句调用析构函数析构A(10) , 这样会有三个函数调用过程,效率极其低下,编译器直接优化成:按照生成临时对象A(10)的方式直接构造生成Aa;这样只有一个函数调用过程
3、接收函数返回值的时候优先使用初始化的方式进行接收,而不是采用赋值的方式
①、假如返回值是个临时变量,采用赋值的方式,首先主调函数内必须先生成一个对象用来接收返回值,此时调用一次构造函数,接收返回值采用赋值,又调用了赋值运算符的重载,赋值完成后临时对象还要析构,到此调用了三次函数。
②、假如采用初始化的方式:那就相当于用临时变量生成一个新对象,注意一旦遇到这种场景,编译器就会进行优化,如下:用生成临时对象的方法构造生成新对象,整个过程只有一次构造函数调用过程,效率大大提高
4、用临时对象生成一个新对象,直接按照生成临时对象方法生成新对象
A a = A(10);正常情况下函数调用如下:
1、构造临时对象 A(10)
2、调用拷贝构造函数生成A a
3、出函数语句 析构 A(10)
完成,以上总共调用了三次函数,消耗巨大,优化之后只有一次:
按照生成A(10)的方式调用构造函数生成A a , 只有一次函数调用 相当于 A a(10);