Указатель в конструкторе копирования - PullRequest
2 голосов
/ 01 апреля 2011

У меня есть конструктор копирования, который выглядит следующим образом:

Qtreenode(const QtreeNode * & n) {

    x=n->x;
    y=n->y;
    height=n->height;
    width=n->width;
    element=n->element;

}

Я написал это неделю назад, и я оглянулся на это сегодня, и я был удивлен строкой, когда при вызове конструктора копирования, скажем, swChild=new QtreeNode(*(n->swChild)); Аргументом для cc является указатель по ссылке, верно? Но когда я это называю, я делаю (* (n-> swChild)), что означает ценность этого ребенка, верно? Почему мой код работает?

Ответы [ 2 ]

5 голосов
/ 01 апреля 2011

Это не конструктор копирования. Конструктор копирования для класса - это конструктор, который берет ссылку на тип класса. Любое из следующего будет конструктором копирования, хотя второй, принимающий константную ссылку, является наиболее часто используемым:

QTreeNode(QTreeNode&);
QTreeNode(const QTreeNode&);
QTreeNode(volatile QTreeNode&);
QTreeNode(const volatile QTreeNode&);

Поскольку это не конструктор копирования, неявно объявленный конструктор копирования все еще предоставляется. Он объявляется как QTreeNode(const QTreeNode& n) и в основном просто копирует каждого члена класса (то есть это «мелкая» копия, а не «глубокая» копия). Именно этот неявно объявленный конструктор копирования используется в вашем коде.

1 голос
/ 01 апреля 2011

Это не конструктор копирования, это просто обычный старый конструктор.Конструктор копирования будет принимать const QtreeNode&, а не const QtreeNode*&.

Поскольку вы не определили конструктор копирования, компилятор создал его для вас.Это тот, который вызывается в строке swChild=new QtreeNode(*(n->swChild));, поскольку вы передаете QtreeNode, а не указатель на один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...