1 #include<iostream>
2 #include <stdio.h>
3 using namespace std;
4 class test{
5 int mvalue;
6 public:
7 explicit test(int i=0){ //此处的explicit表明该构造函数需要显示的调用
8 printf("%s(%d)\n", __func__, i);
9 mvalue = i;
10 }
11
12 test& operator=(const test& that)
13 {
14 printf("%s(test&)\n", __func__);
15 mvalue = that.mvalue;
16 return *this;
17 }
18
19 test(const test& that)
20 {
21 printf("%s(test&)\n", __func__);
22 mvalue = that.mvalue;
23 }
24
25 test& operator=(const int& that)
26 {
27 printf("%s(int&)\n",__func__);
28 mvalue = that;
29 return *this;
30 }
31
32 int value(){
33 return mvalue;
34 }
35 test& operator++(){
36 ++mvalue;
37 return *this;
38 }
39 //后++
40 test operator++(int){
41 //临时对象
42 //test ret(mvalue);
43 int ret = mvalue;
44 mvalue++;
45 return test(ret); //此处由于在有参构造的地方加上了explicit在需要显示的调用test(int i);
46 }
47 };
48
49 int main(){
50 test t(0);
51 test tt = t++;
52 test t1(t); //<=等价=> test t1 = t 其本质还是调用拷贝构造函数。在对象创建出来之前编译器禁止使用=号操作符重载函数,只能调用构造函数;
53 t1 = t; // <=等价=> t1.operator=(t);
54 cout << t1.value() << endl;
55 cout << tt.value() << endl;
56 cout << t.value() << endl;
57 return 0;
58 }