我主要是对返回值类型有疑惑,于是读了一些博客,自己再敲一敲备忘一下
如果函数 operaor= 的返回值为空,代码如下
#include <iostream>
using namespace std;
class Test
{
public:
Test(int x=0)
{
m_x = x;
}
void operator=(const Test& t)
{
this->m_x = t.m_x;
return;
}
private:
int m_x;
};
int main()
{
Test t1(2);
Test t2;
Test t3;
t2 = t1;
t2.operator=(t1); //显示调用
t3 = t2 = t1; //第一个等号下红色波浪线
t3.operator=( t2.operator=(t1) ); //t2下红色波浪线
return 0;
}
那么 t2=t1 不报错,但连续赋值 t3=t2=t1 报错,
t3=t2=t1 用显示调用表示为 t3.operator=(t2.operator=(t1));?? ?
如果函数 operator= 的返回值为空,那么 t3.operator=() 就没有参数了,
所以函数 operator= 得有一个当前类型的返回值,这里就是 Test 类型,
代码如下
#include <iostream>
using namespace std;
class Test
{
public:
Test(int x=0)
{
m_x = x;
}
Test(const Test& other)
{
this->m_x = other.m_x;
cout << "using copy constructor...\n";
}
Test operator=(const Test& t)
{
this->m_x = t.m_x;
return *this;
}
private:
int m_x;
};
int main()
{
Test t1(2);
Test t2;
Test t3;
t3 = t2 = t1;
t3.operator=(t2.operator=(t1));
return 0;
}
这里我们在 t3=t2=t1 这行加上断点,进入调试后,F11一步步走,
可以看到在函数?operator= 的 return 时,进入到了拷贝构造函数中,
看大佬们博客说这样效率低,
所以要在函数 operator= 的返回类型Test上加上引用,即:
Test& operator=(const Test& t)
这样return时就不会进入到拷贝构造函数中了
|