Скотт Мейерс в своей книге «Эффективный C++» говорит:
Чтобы запретить функциональность, автоматически предоставляемую компиляторами, объявите соответствующие функции-члены закрытыми и не давайте реализаций. Тогда, если кто-то непреднамеренно вызовет одну из них, он получит сообщение об ошибке во время компоновки.
Я попытался написать пример программы для достижения того, что пытался объяснить Скотт. Я мог добиться того же, даже когда функция-член была объявлена public
и не имела реализации. Ошибка ссылки возникла в моем случае также, когда я попытался инициализировать объект из другого объекта. Поэтому я не понимаю, почему Скотт подчеркивает необходимость объявления функции-члена private
?
Моя примерная программа написана ниже:
#include <iostream>
using namespace std;
class Unique
{
private:
int num;
public:
Unique(int x)
{
num = x;
}
Unique(const Unique &obj);
Unique& operator =(const Unique &obj);
void disp(void)
{
cout << "num = " << num << "\n";
}
};
int main()
{
Unique ob1(3);
Unique ob2(ob1);
ob1.disp();
ob2.disp();
return 0;
}
Я получаю следующую ошибку ссылки:
/tmp/ccXfqSqE.o(.text+0x135): В функции
main': : undefined reference to
Unique::Unique(Unique const&)' collect2: ld вернул 1 статус выхода