当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 为什么要在operator=中返回*this的引用
| 为什么要在operator=中返回"*this"的引用 下载本文示例代码 // a.hclass A {public:A(); A(int nTest); A(const A& a); virtual ~A(); A operator=(const A& a); // A& operator=(const A& a);private: int m_nTest; public: void printit();};}// a.cppA::A(int nTest){ m_nTest = nTest; cout << "constructor A Value is executed now!" << endl;}A::A(const A& a){ this->m_nTest = a.m_nTest; cout << "Copy constructor A is executed now!" << endl; }A::A(){ cout "constructor A Default is executed now!" << endl;}A::~A(){ cout << "Destructor A is executed now!" << endl;}A A::operator=(const A& a)// A& A::operator=(const A& a){ if (this==&a) return *this; this->m_nTest = a.m_nTest; cout << "Assignment A is executed now!" << endl; return *this;} 在main()函数中调用 A a(100),b(99),c(98);a = b = c;a.printit();b.printit();c.printit();结果为:
如果将 A operator=(const A& a) 改为 A& operator=(const A& a) 则结果为:
两者的不同为前者比后者多执行了两次构造(拷贝构造函数)和析构函数,可见在执行过程充产生了两个临时对象。 [1]在赋值函数为:A operator=(const A& a)的情况下 对于a=b=c; 实际为a.operator=(b.operator=(c)) 在执行A operator=(const A& a) 后返回 *this 给一个临时对象,所以生成和销毁这个临时对象的时候分别要调用构造和析构函数,而构造时是用一个已经存在的实例出初始化同类型的实例,所以调用的拷贝初始化函数。析构时,先析构前面一个(a.operator=)产生的临时对象,后析构"b.operator="产生的临时对象. [2] 在赋值函数为:A& operator=(const A& a)的情况下 |