废后成妃,令家陨落记,天蓬纵横
首先c++里的各种运算符都是用函数实现的,比如=,就等号函数。
所以当用=给一个对象赋值的时候,实际调用的是=号所对应的=号函数。
分析下面的代码
#include <iostream> using namespace std; class test{ public: explicit test(){ data = 0; } explicit test(int d):data(d){ cout << "c:" << this << ":"<< this->data << endl; } //拷贝构造函数 test(const test &t){ cout << "copy:" << this << endl; data = t.data; } //重载=号运算符 test& operator= (const test &t){ cout << "assign" << this << endl; if(this != &t){ data = t.data; } return *this; } ~test(){ cout << "f:" << this << ":" << this->data << endl; } private: int data; }; int main(){ test t1(10); test t2, t3; t3 = t2 = t1; return 0; }
重点分析下面的函数
//重载=号运算符 test& operator = (const test &t){ cout << "assign" << this << endl; if(this != &t){ data = t.data; } return *this; }
分析点:
1,operator =是什么意思
2,参数为什么是引用类型
3,参数为什么有const限制
4,为什么有if(this != &t)的判断
5,为什么有返回值
6,为什么返回值的类型是引用类型
分析点解答:
test t2;
1,重载类test的=号函数,当对类test的对象用=号操作的时候,就会调用这个重载后的函数
2,避免调用拷贝构造函数
3,避免不小心修改里参数t里面成员变量的值(t.data = 100;)
4,防止自己给自己赋值
5,为了能够使用 t3 = t2 = t1。如果没有返回值,则t3.operator=(t2=t1),的参数里面t2=t1就没有返回值,所以编译不过。
6,不是引用也可以,用引用类型是防止老版本的编译器,在return处调用拷贝构造函数,新版本的编译器(gcc 4.8.5-20),即使不用引用类型,就不会调用拷贝构造函数。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论