gpt4 book ai didi

c++ - 拷贝构造函数知识

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:23 25 4
gpt4 key购买 nike

我读过的大多数关于复制构造函数实现的帖子都说你还必须重载赋值运算符。我不明白为什么这是真的。我可以在不进行任何运算符重载的情况下实现复制构造函数,并且它工作正常。您能否解释一下我遗漏了什么或为什么我需要遵循此协议(protocol)?

下面是一些按我预期的方式工作的基本代码:

//
// Event.h
// PointerPractice
//

#ifndef PointerPractice_Event_h
#define PointerPractice_Event_h

#include <string>

class Event{


public:

Event();

Event(const Event& source);

~Event();

std::string getName();
void setname(std::string theName);

uint64_t getBeginTime();
void setBeginTime(uint64_t time);

uint64_t getDuration();
void setDuration(uint64_t dur);



private:

std::string name_;
uint64_t time_;
uint64_t duration_;


};
#endif


//
// Event.cpp
// PointerPractice
//

#include <iostream>
#include "Event.h"

Event::Event(){

this->name_ ="";
this->time_ = 0;
this->duration_ = 0;
}

Event::Event(const Event& source){

this->name_ = source.name_;
this->time_ = source.time_;
this->duration_ = source.duration_;

}

Event::~Event(){}

std::string Event::getName(){

return this->name_;
}


void Event::setname(std::string theName){

this->name_ = theName;

}


uint64_t Event::getBeginTime(){

return this->time_;
}

void Event::setBeginTime(uint64_t time){

this->time_ = time;
}

uint64_t Event::getDuration(){

return this->duration_;
}

void Event::setDuration(uint64_t dur){

this->duration_ = dur;

}




// main.cpp
// PointerPractice
//

#include <iostream>
#include <vector>
#include "Event.h"

int main (int argc, const char * argv[])
{

Event *firstPtr = new Event();
firstPtr->setname("DMNB");
firstPtr->setBeginTime(4560000);
firstPtr->setDuration(2000000);


std::cout<<"Test first Event object begin time "<<firstPtr->getBeginTime()<<std::endl;


Event *secPtr = new Event(*firstPtr);


secPtr->setBeginTime(2222222);
std::cout<<"Test first Event object begin time "<<firstPtr->getBeginTime()<<std::endl;
std::cout<<"Test second Event object begin time "<<secPtr->getBeginTime()<<std::endl;


return 0;
}

谢谢你的信息

最佳答案

赋值运算符不会以任何方式影响复制构造函数,您可以在没有赋值运算符的情况下定义复制构造函数。

但是你愿意吗?需要自定义复制行为的类通常希望该自定义行为适用于复制构造和复制分配。这是 3 规则(现在是 5)的基本原理。如果您有无法默认复制和默认销毁的原始指针或其他成员,则默认复制赋值运算符可能也不正确。

当然,如果您不喜欢默认的复制赋值运算符,而不是编写一个新的,那么简单地禁用复制赋值运算符是完全合理的。

对于您的特定代码,您不需要自定义复制赋值运算符是对的。但是您也不需要自定义复制构造函数,因为默认行为已经是您想要的。事实上,编译器生成的默认复制构造函数比您定义的要好,因为它会复制构造成员而不是默认构造然后重新分配。

关于c++ - 拷贝构造函数知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9661899/

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