c ++ Использование const в конструкторе копирования? - PullRequest
1 голос
/ 24 марта 2012

Я никогда не писал конструктор копирования, поэтому, чтобы избежать боли, я хотел знать, является ли то, что я кодировал, законным.Он компилируется, но я не уверен, что он работает так, как должен конструктор копирования.

Также мне нужно использовать const в конструкторе копирования, или я могу просто удалить его.(Что мне не нравится в const, так это то, что компилятор плачет, если я использую некоторые неконстантные функции).

//EditNode.h
class EditNode
{
      explicit EditNode(QString elementName);
      EditNode(const EditNode &src);
}

//EditNodeContainer.h
class EditNodeContainer : public EditNode
{
      explicit EditNodeContainer(QString elementName);
      EditNodeContainer(const EditNodeContainer &src);
}

//EditNodeContainer.cpp
EditNodeContainer::EditNodeContainer(QString elementName):EditNode(elementName)
{
}       

//This seems to compile but not sure if it works
EditNodeContainer::EditNodeContainer(const EditNodeContainer &src):EditNode(src)
{

}


//the idea whould be to do something like this
EditNodeContainer *container1 = new EditNodeContainer("c1");
EditNodeContainer *copyContainer = new EditNodeContainer(container1);

Ответы [ 3 ]

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

Конструктор копирования - это конструктор с одной из следующих подписей:

class A
{
    A(A& other);
    //or
    A(const A& other);
    //or
    A(volatile A& other);
    //or
    A(const volatile A& other);
    //or any of the above + other parameters that have default arguments
    //example:
    A(const A& other, int x = 0) //this is also a copy constructor
};

Выше указано в 12.8.2 стандарта - C ++ 03. поэтому вы правильно реализуете конструктор копирования.

Причина, по которой он должен получить параметр const, заключается в том, что вы не меняете объект, с которого копируете. Если вы вызываете неконстантные функции, вы делаете что-то не так.

Также в вашем фрагменте

EditNodeContainer *container1 = new EditNodeContainer("c1");
EditNodeContainer *copyContainer = new EditNodeContainer(container1);

вы не вызываете конструктор копирования, потому что вы передаете EditNodeContainer* в качестве параметра, а не EditNodeContainer.

1 голос
/ 24 марта 2012

Вам не хватает одного * символа.Конструктор копирования ожидает ссылку на объект, но ему предоставляется указатель на объект.Просто замените container1 на *container1 в качестве параметра конструктора копирования.

0 голосов
/ 24 марта 2012

Параметр конструктора копирования может быть ссылкой lvalue на non-const или ссылкой lvalue на const, но на практике это всегда ссылка на const (устаревший auto_ptr является исключением).

Вы не должны писать конструктор копирования, если вам не нужно и вы полностью не понимаете последствия.Если вы используете повсеместно классы RAII, вам редко нужен пользовательский конструктор копирования (если вы не пишете класс RAII).

Кроме того, по возможности избегайте необработанных указателей и new.

...