gpt4 book ai didi

c++ - 非参数和复制构造函数

转载 作者:行者123 更新时间:2023-11-30 04:16:00 24 4
gpt4 key购买 nike

我对下面的代码有两个问题。

First

CASE1 和 CASE2 有什么区别?我可以看到 CASE2 由于缺少非参数构造函数而无法编译。为什么 CASE1 编译?

Second

CASE3 和 CASE4 有什么区别?为什么调用复制构造函数或赋值运算符?根据this教程复制构造函数被调用

when instantiating one object and initializing it with values from another object

这正是这些情况下发生的情况。请注意,

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

最佳答案

CComplexNumber a(); //CASE1

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

至于剩下的,就叫copy elision .编译器可以自由地消除对复制构造函数的不必要调用,即使这些调用会产生副作用。

关于c++ - 非参数和复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com