1

我对以下代码有两个问题。

第一的

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]|
4

1 回答 1

2
CComplexNumber a(); //CASE1

这不是对象创建。它是一个函数声明。您正在声明一个名为 的函数a,它不接受任何参数并返回一个CComplexNumber.

至于其余的,称为复制省略。编译器可以自由地消除对复制构造函数的不必要调用,即使这些调用会产生副作用。

于 2013-07-31T03:46:06.680 回答