Конструктор копирования определяет и объявляет разницу?

У меня есть класс Base и производный от класса.

  1. Если я объявлю конструктор копирования в своем классе, определит ли компилятор конструктор копирования во время компиляции?
  2. Что произойдет, если вызвать конструктор копирования класса Derived? Зависит ли это от конструктора копирования базового класса?

(Мне нужно знать связь между базовым классом и производным с точки зрения конструктора копирования во время стандартной компиляции. Что делает и как компилятор определяет конструктор копирования)


person Balamurugan    schedule 19.02.2013    source источник


Ответы (1)


Если я объявлю конструктор копирования в своем классе, определит ли компилятор конструктор копирования во время компиляции?

Нет, не будет.

Если вы просто объявите конструктор копирования и не определите его, вы получите ошибку связывания. Предоставляя явное объявление для конструктора копирования, вы сообщаете компилятору, что неявно сгенерированного недостаточно для ваших нужд, и обещаете, что предоставите свою собственную версию. Но когда вы не даете определения, вы нарушаете это обещание.

Что произойдет, если вызвать конструктор копии производного класса? Зависит ли это от конструктора копирования базового класса?

Наличие или отсутствие конструктора копирования в базовом классе не влияет на конструктор копирования в производном классе. Правила просты:
Компилятор создает конструктор копии для вашего класса, если вы не укажете явное объявление. Обратите внимание, что компилятор делает это только в том случае, если ваш код использует конструктор копирования. Если компилятор обнаружит, что ваш код никогда не использует конструктор копирования, он не будет генерировать конструктор копирования просто потому, что это ненужные накладные расходы и нарушение основного правила C++: "Вы платите только за то, что используете"

person Alok Save    schedule 19.02.2013
comment
Однако, если вы объявляете частный конструктор копии (чтобы сообщить, что класс не может быть скопирован), объявление не требуется, так как его нельзя вызвать. А конструктор производной копии по умолчанию вызовет конструктор базовой копии, так что есть некоторая зависимость. - person Codeguard; 19.02.2013