早上起来闲来无事写了段代码
先看吧
#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自定义,一定要看好参数类型,尤其是注意右值和左值的区别。

本文通过一个简单的C++程序实例介绍了类的构造、复制构造及运算符重载的基本概念。重点分析了自定义类中加法运算符重载的行为,并解释了在不同上下文中构造函数和赋值操作的调用情况。
1049

被折叠的 条评论
为什么被折叠?



