我对以下代码有两个问题。
第一的
CASE1 和 CASE2 有什么区别?我可以看到 CASE2 由于缺少非参数构造函数而无法编译。为什么 CASE1 编译?
第二
CASE3 和 CASE4 有什么区别?为什么调用复制构造函数或赋值运算符?根据本教程,复制构造函数被调用
实例化一个对象并使用另一个对象的值对其进行初始化时
这正是在这些情况下发生的情况。注意
C复数e=c;
在概念上与 CASE3 相同,但这里调用了复制构造函数。
#include <iostream>
using namespace std;
class CComplexNumber {
float m_realPart;
float m_imagPart;
public:
CComplexNumber(float real, float imaginary) : m_realPart(real), m_imagPart(imaginary) {
cout<<"Constructor called"<<endl;
}
CComplexNumber(const CComplexNumber & copy) {
cout<<"Copy constructor called"<<endl;
this->m_realPart=copy.m_realPart;
this->m_imagPart=copy.m_imagPart;
}
CComplexNumber& operator=(const CComplexNumber& rhs){
cout<<"Assignment operator called"<<endl;
this->m_realPart=rhs.m_realPart;
this->m_imagPart=rhs.m_imagPart;
return *this;
}
friend ostream& operator<<(ostream& out,const CComplexNumber& rhs){
out<<"["<<rhs.m_realPart<<","<<rhs.m_imagPart<<"]";
return out;
}
};
int main() {
CComplexNumber a(); //CASE1
//CComplexNumber b; //CASE2
CComplexNumber c=CComplexNumber(3,4); //CASE3
CComplexNumber d(CComplexNumber(5,6));//CASE4
cout<<a<<"|"<<c<<"|"<<d<<"|"<<endl;
return 0;
}
输出
Constructor called
Constructor called
1|[3,4]|[5,6]|