早上起来闲来无事写了段代码
先看吧
#include <bits/stdc++.h>
using namespace std;
class Num{
int real,imag;
public:
Num(int real,int imag):real(real),imag(imag){cout<<"calling constructing"<<endl;}
Num(){}
Num(const Num&n){
cout<<"calling copy"<<endl;
real=n.real;
imag=n.imag;
}
Num operator +(const Num&n){
cout<<"calling +"<<endl;
return {real+n.real,imag+n.imag};
}
Num operator =(const Num&n){
cout<<"calling ="<<endl;
real=n.real;
imag=n.imag;
}
};
int main(){
Num N1(5,6);
Num N2(6,9);
Num N3=N1+N2;
return 0;
}
本来预期是
2个constructing
1个calling +
1个calling =
后来发现
原因是:
N1+N2在重载+号运算符里也调用了构造函数,(多出来的constructing)
Num N3=N1+N2是初始化,不是赋值(少了的calling =)
验证
改为
则有
反思:
对于这种class自定义,一定要看好参数类型,尤其是注意右值和左值的区别。