非参数和复制构造函数

时间:2013-07-31 03:43:18

标签: c++ constructor copy-constructor

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

  

第一

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

1 个答案:

答案 0 :(得分:2)

CComplexNumber a(); //CASE1

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

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