Test GetTestObject(Test &t)
{
int value = t.getData();
return Test(value);
}
C++中函数的调用过程内部往往会调用很多函数,比如定义对象会默认调用构造函数和析构函数;如果定义对象的同时用另外一个对象来初始化它会调用拷贝构造函数;如果先定义一个对象,然后再用已有的对象来初始化该对象会调用赋值构造函数。所以,一来二去调用函数的过程中不仅会生成多个临时变量,还会多次调用函数。使得效率大大降低,所以在定义对象的和实现的过程中应记住以下三点:
1、函数调用传对象时,按对象引用来传递,会少两个函数的调用
2、函数返回对象的时候,应该返回一个临时对象,不要先定义再返回
3、调用返回对象的函数时,应该以初始化的方式调用,而不是以赋值的方式调用
class Test
{
public:
//构造
Test(int data = 100) : ma(data)
{
cout << this <<": Test(int)" << endl;
}
//拷贝构造
Test(const Test &src) : ma(src.ma)
{
cout << this <<": Test(const Test &)" << endl;
}
//赋值构造
Test & operator = (const Test &src)
{
ma = src.ma;
cout << this <<": Test& operator=(const Test &)" << endl;
return *this;
}
//析构
~Test()
{
cout << this <<": ~Test()" << endl;
}
int getData() { return ma; }
private:
int ma;
};
Test GetTestObject(Test t)
{
int value = t.getData();
Test tmp(value);
return tmp;
}
int main()
{
Test t1;
Test t2;
t2 = GetTestObject(t1);
cout << t2.getData() << endl;
}
代码运行结果分析:
0113F8CC:Test(int) //构造t1
0113F8C0:Test(int) //构造t2
0113F7C4:Test(const Test &) //实参t1通过值传递给 Test GetTestObject(Test t),调用拷贝构造函数
0113F798:Test(int) //构造对象tmp
0113F7F4:Test(const Test &) //return tmp;将tmp拷贝构造给栈上的临时对象
0113F798:~Test() //析构对象tmp
0113F7C4:~Test() //析构形参t
0113F8C0:Test& operator=(const Test &) //将Test GetTestObject(Test t)返回的值赋值构造给对象t2
0113F7F4:~Test() //析构return tmp;时生成的临时对象
100 //cout语句打印返回值
0113F8C0:~Test() //析构t2
0113F8CC:~Test() //析构t1
通过打印结果我们可以清楚的看到整个程序的函数调用过程!但是调用过程确实和繁琐,效率不高。所以先以第一点来做一个改变,将参数改为按引用传递。
Test GetTestObject(Test &t)
{
int value = t.getData();
Test tmp(value);
return tmp;
}
对比可以清楚发现少了函数调用时的拷贝构造和析构函数。
然后我们再按第二点来继续优化程序代码:
Test GetTestObject(Test &t)
{
int value = t.getData();
return Test(value);
}
对比可以清楚发现少了临时对象的拷贝构造和析构函数
然后我们再按第三点来继续优化程序代码:
int main()
{
Test t1;
Test t2 = GetTestObject(t1);
cout << t2.getData() << endl;
}
对比可以清楚发现少了赋值构造和析构函数。
所以在写代码的时候尽量可以按照这三点来提高自己代码的效率。