示例一:
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.能使用引用就使用引用