我对以下代码有两个问题。
第一
CASE1和CASE2有什么区别?我可以看到CASE2由于缺少非参数构造函数而无法编译。为什么CASE1会编译?
第二
CASE3和CASE4有什么区别?为什么复制构造函数或赋值运算符被调用?根据{{3}}教程,复制构造函数被称为
实例化一个对象并使用来自的值初始化它 另一个对象
这正是在这些情况下发生的事情。注意
CComplexNumber 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]|
答案 0 :(得分:2)
CComplexNumber a(); //CASE1
这不是对象创建。这是一个功能声明。您正在声明一个名为a
的函数,该函数不接受任何参数并返回CComplexNumber
。
至于其余部分,它被称为copy elision。编译器可以自由地消除对复制构造函数的不必要的调用,即使这些调用会产生副作用。