一: 程序的优化
class A{
public:
int val1;
int val2;
A(int v1 =0;int v2 = 0):val1(v1),val2(v2){
cout << "调用了构造函数" <<endl;
cout << val1 <<endl;
cout << val2 <<endl
}
A(const A &t): val1(t.val1),val2(t.val2){
cout << "调用了拷贝构造函数" <<endl;
}
virtual ~A(){
cout << "调用了析构函数" << endl;
}
}
A Double(A &ta){
A a;
a.val1 = ta.val1 * 2;
a.val2 = ta.val2 * 2;
return a; //生成临时对象返回
}
int main(){
A testa(10, 20);
Double(testa);
}
/*
输出结果:
调用了构造函数 // A a 调用构造函数
10
20
调用了构造函数 // Double中A a调用构造函数
0
0
调用了拷贝构造函数 // 生成临时对象返回 调用拷贝构造函数
调用了析构函数 // Double 中的A a超过作用域 被析构
调用了析构函数 // Double(testa); 没有值来接这个临时对象
//所以这个临时对象被析构了(如果 A a2 = Double(testa),则不会被析构
调用了析构函数 // testa 被析构
相同的代码在windows 和Linux 运行结果不相同
g++ 编译器对类似这种返回值的临时对象问题进行了优化 ( NRV named return value
VS也可以通过相关配置优化成类似与g++相同的效果
*/
// A Double(A &ta){
// A a; // 消耗一个构造函数 一个析构函数
// a.val1 = ta.val1 * 2;
// a.val2 = ta.val2 * 2;
// return a; //生成临时对象返回
// }
// 所以上面的代码可以这样:
A Double(A &ta){
return A(ta.val1 * 2, ta.val2 * 2);
}
/*
输出结果:
调用了构造函数
10
20
调用了构造函数
20
40
调用了析构函数 // Double 类返回的临时对象没有人接 直接被析构掉
调用了析构函数 // testa 析构
*/
// 编译器视角的代码:
// A testa(10, 20);
// Double(testa);
/* 修改后的double代码
void Double(A aobj, A &ta){
aobj.A::A(ta.val1 * 2, ta.val2 * 2);
return;
}
A testa; // 不调用构造函数 只定义一个对象
testa.A::A(10, 20);
A aobj // 一个临时对象
Double(aobj, testa); // 编译器对Double函数进行添加代码 添加一个参数
*/