正文
构造函数,拷贝构造和赋值运算符调用时机,explicit,
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
#include<iostream>
#include <stdio.h>
using namespace std;
class test{
int mvalue;
public:
explicit test(int i=){ //此处的explicit表明该构造函数需要显示的调用
printf("%s(%d)\n", __func__, i);
mvalue = i;
} test& operator=(const test& that)
{
printf("%s(test&)\n", __func__);
mvalue = that.mvalue;
return *this;
} test(const test& that)
{
printf("%s(test&)\n", __func__);
mvalue = that.mvalue;
} test& operator=(const int& that)
{
printf("%s(int&)\n",__func__);
mvalue = that;
return *this;
} int value(){
return mvalue;
}
test& operator++(){
++mvalue;
return *this;
}
//后++
test operator++(int){
//临时对象
//test ret(mvalue);
int ret = mvalue;
mvalue++;
return test(ret); //此处由于在有参构造的地方加上了explicit在需要显示的调用test(int i);
}
}; int main(){
test t();
test tt = t++;
test t1(t); //<=等价=> test t1 = t 其本质还是调用拷贝构造函数。在对象创建出来之前编译器禁止使用=号操作符重载函数,只能调用构造函数;
t1 = t; // <=等价=> t1.operator=(t);
cout << t1.value() << endl;
cout << tt.value() << endl;
cout << t.value() << endl;
return ;
}