一:临时对象的概念
在这里插入代码片
二:临时对象的产生情况和解决
(1)以传值的方式给函数传递参数
#include <iostream>
using namespace std;
class A
{
public:
int val1;
int val2;
public:
A(int argone = 0, int argtwo = 0)
{
val1 = argone;
val2 = argtwo;
std::cout << "构造函数" << std::endl;
}
A(const A& obj)
{
val1 = obj.val1;
val2 = obj.val2;
std::cout << "拷贝构造函数" << std::endl;
}
A& operator= (const A& obj)
{
val1 = obj.val1;
val2 = obj.val2;
std::cout << "拷贝赋值运算符" << std::endl;
return *this;
}
~A()
{
std::cout << "析构函数" << std::endl;
}
int add(A t)
{
int tmp = t.val1 + t.val2;
t.val1 = 100;
return 100;
}
};
int main()
{
A a(1, 2);
/*函数传值产生的临时对象,这是一个假的临时对象*/
int sum = a.add(a);
std::cout << sum << std::endl;
std::cout << a.val1 << std::endl;
return 0;
}
(2)类型转换生成的临时对象/隐式类型转换以保证函数调用成功
#include <iostream>
using namespace std;
class A
{
public:
int val1;
int val2;
public:
A(int argone = 0, int argtwo = 0)
{
val1 = argone;
val2 = argtwo;
std::cout << "构造函数" << std::endl;
}
A(const A& obj)
{
val1 = obj.val1;
val2 = obj.val2;
std::cout << "拷贝构造函数" << std::endl;
}
A& operator= (const A& obj)
{
val1 = obj.val1;
val2 = obj.val2;
std::cout << "拷贝赋值运算符" << std::endl;
return *this;
}
~A()
{
std::cout << "析构函数" << std::endl;
}
int add(A t)
{
int tmp = t.val1 + t.val2;
t.val1 = 100;
return 100;
}
};
int main()
{
A o;
/*这里涉及隐式类型转换,把100转换为一个A类型的临时对象,所以会调用构造函数,
随即这个临时对象会调用拷贝赋值运算符,最后系统将这个临时对象进行销毁*/
o = 100;
return 0;
/*如果换成
A o = 100;则会省略很多步骤*/
}
(3)函数返回对象的时候