本文主要是介绍隐式类型转换/匿名对象的使用以及构造拷贝构造的优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
示例一:
class A
{
private:int _n;
public:A(int n){_n = n;cout << "A()" << endl;}A(const A& a){cout << "A(const A& a)" << endl;}~A(){cout << "~A()" << endl;}
};
void func(A a){}
对于func可以有如下三种调用
int main()
{A a1(1);func(a1);
}
int main()
{func(A(1));
}
int main()
{func(1);
}
这三种哪种最好呢?构造越少就越好。
对于第二个,实际上是先调用构造函数构造出一个临时对象,再调用拷贝构造进行参数传递,而编译器将这两步优化为直接使用数字1去构造出形参
对于第三个,实际上是先用1构造出一个临时对象,再拷贝构造传参,同上,编译器合二为一了。
所以说,一个表达式,连续的构造会合二为一。
示例二:
还是这个,func最好使用引用传参
但这时,有些调用方式就会出现问题:
为什么呢?因为首先会用数字生成临时变量,再将变量给到引用。但是临时变量具有常性,将常量给到一个变量就会出错。所以应该为:
此时不管传常量对象还是变量对象都可以。前提是,这是一个只读函数
根据这些例子,其实不难看出,隐式类型转换也有常性
总结:
1.能使用匿名对象/隐式类型转换就使用,因为编译器可以优化
2.同一个表达式的多个构造/拷贝构造能够优化合二为一
3.隐式类型转换具有常性
4.能使用引用就使用引用
这篇关于隐式类型转换/匿名对象的使用以及构造拷贝构造的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!