Скот Майерс в книгата си "Ефективен 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 изходен статус