копировать конструктор - PullRequest
2 голосов
/ 12 марта 2012

Большинство сообщений, которые я читал о реализации конструктора копирования, таковы, что вы также должны перегружать оператор присваивания.Я не понимаю, почему это правда.Я могу реализовать конструктор копирования без перегрузки операторов, и он работает нормально.Не могли бы вы объяснить, что мне не хватает или почему мне нужно следовать этому протоколу?

Вот базовый код, который работает так, как я ожидал:

//
//  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;
}

Спасибо заинформация

1 Ответ

3 голосов
/ 12 марта 2012

Оператор присваивания никак не влияет на конструктор копирования, вы МОЖЕТЕ определить конструктор копирования без оператора присваивания.

Но вы хотите? Классы, которым требуется настраиваемое поведение копирования, обычно хотят, чтобы это настраиваемое поведение применялось как к конструкции копирования, так и к назначению копирования. Это обоснование для правила 3 ​​(теперь 5). Если у вас есть необработанные указатели или другие элементы, которые не могут быть скопированы по умолчанию и уничтожены по умолчанию, то оператор назначения копирования по умолчанию, вероятно, также неверен.

Конечно, вполне разумно просто отключить оператор назначения копирования, если вам не нравится значение по умолчанию, вместо написания нового.

В случае вашего конкретного кода, вы правы, что вам не нужен пользовательский оператор назначения копирования. Но вам также не понадобился пользовательский конструктор копирования, поскольку поведение по умолчанию уже было бы таким, как вы хотели . Фактически, сгенерированный компилятором конструктор копирования по умолчанию лучше, чем тот, который вы определили, поскольку он будет копировать элементы конструкции вместо конструирования по умолчанию, а затем переназначать.

...