У меня есть следующий класс в одном файле .h:
class MyClass
{
protected:
MyClass();
~MyClass();
private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
};
inline MyClass::MyClass()
{
}
inline MyClass::~MyClass()
{
}
Что меня смущает, так это отсутствие кода MyClass (const MyClass&) конструктор копирования и Мои занятия& operator = (const MyClass&) перегружены операторы присваивания. У класса просто есть определения, но больше ничего нет.
Я видел это в коде, который я анализирую, и он прекрасно компилируется. Я новичок в C ++ и во всех примерах, которые я видел, я нашел определение в классе и реализацию ниже или в отдельном файле .cpp
Итак, любой может объяснить, почему этот код компилируется и почему вы бы включили только объявление функции, но не ее реализацию?
Спасибо!!
Копирование конструкции и назначение были явно запрещены автором.
Если это используется внешне, это будет ошибкой (потому что это private
). Если на него ссылаются внутренне или friend
тогда он выдаст ошибку ссылки, поскольку определение не существует.
В C ++ 11 это более четко написано как:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
Здесь компилятор заметит это при компиляции — без ошибок компоновщика и четких намерений без дополнительной документации 🙂
Код будет компилироваться, если функции определены, но не используются. Если они определены и никогда не используются, оптимизатор удалит их. Однако, если они используются, вы получите ошибку компоновщика.
Это плохая практика, чтобы определить функцию, а не заполнить ее. Особенно, если кто-то собирается использовать этот код.
Хотя Крис делает хорошее замечание в комментариях. Это может быть полезно, если вы не хотите, чтобы люди использовали функцию по умолчанию. Это также, почему это находится в частном разделе, когда что-то вроде copy
или же =
должно быть публично нормально.
Если вы явно определяете конструктор, вы отключаете все другие неявные конструкторы. Так что это имеет значение и может быть полезно во многих ситуациях. Однако я не вижу смысла определять и оставлять пустым деструктор (который даже не объявлен виртуальным).