思考:我们在构造运算符重载+号重载的时候会构造那些函数呐???
例子:小dome
//该运算重载函数 由 左操作数调用,右操作数当做实参传递给该函数 //触发t1+t3->t1.operator +(t3) Test operator +(const Test &t) { cout << "Test operator +(Test &t)" <<endl; Test val;//保存最后的执行结果 val.data = this->data + t.data; val.ptr = new char [strlen(this->ptr) + strlen(t.ptr) + 1]; //将分配的堆空间初始化为0 memset(val.ptr,0,strlen(this->ptr)+strlen(t.ptr)+1); strcat(val.ptr,this->ptr); strcat(val.ptr,t.ptr); return val; } eg: main { Test t4 = t1 + t3; }
当调用重载函数返回了val 对象,但是随着该函数的调用结束对象val会被系统回收了,因为对象val在函数的栈上
。
那是如何保存值的呐????????????
这是是通过拷贝,在内存上有一块空间暂存拷贝过来的val对象,这个时候就会触发拷贝构造函数的调用,然后我们在main函数中由触发了一次拷贝构造函数
所以总共进行了两次拷贝构造函数
但是打印出来的拷贝构造函数一次都没有
//拷贝构造函数 Test(const Test & t) { cout << "Test(const Test & t)" << endl; //实现深拷贝 this->data=t.data; // this->ptr = t.ptr;//浅拷贝 if(strlen(t.ptr)) { this->ptr = new char[strlen(t.ptr)+1]; strcpy(this->ptr,t.ptr); } else ptr= new char[10]; }
这是因为编译器对其进行了优化,提高了效率,想要查看的话(以Clion为例)打开Terminal模式
输入:g++ main.cpp -o main -fno-elide-constructors
输入:dirc,查看目录
此时产生了一个新的文件叫做main.exe
执行main.exe
可以看到显示调用了一次运算符重载函数
后边产生了两次构造函数