Loading...
Jovanna avatar Jovanna 186 Точки

Правило на 3-те в дифолтен вариант: ако напишем едното, трябва ли да добавим и другите две, ако всички са като дифолтните?

Здравейте,

Когато не пишем нищо от 3-те: деструктор, copy-assignment oператор и copy-конструктор , те се генерират автоматично.

Тогава защо ако напишем изрично ~Person() { }   трябва да добавяме и другите две от 3-те? Нали написаният тук деструктор е точно този, който би се генерирал автоматично, а другите 2 ще си се генерират?

~Person() { }

или:

~Person() { std::cout << "destroy person" << std::endl; }

т.е.,  ако напишем едно от 3-те по същия начин, както би било дифолтното, и искаме и другите 2 да са ни дифолтни, трябва ли изрично да ги пишем в кода, или може да оставим те да си се генерират автоматично?

Поздрави!

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Не, не е нужно да повтаряш default-ните, ако не правиш нищо особено в някое от тях. Правилото на 3-те по-скоро казва "ако ти ТРЯБВА едно от трите, ти трябват и трите", и още по-конкретно "ако класът ти управлява ресурс, за който ти трябва едно от трите, значи ти трябват и трите" (даже тук трябва да има вмъкнато "най-вероятно ти трябват", не "задължително").

В примери като този с Person, реално нито едно от трите не ти трябва (е, ползваш деструктора за да пишеш по конзолата, ама това не е управление на ресурс, тоест не правиш нещо реално свързано с този Person), така че дори и да напишеш един от трите, няма нужда да пишеш другите, защото те няма какъв ресурс да управляват, тоест default-ните им версии ти вършат работа.

В примера обаче с броенето на Person-и (или Lecturer-и, не помня точно какво ползвах за пример в лекцията), бройката е ресурс в някакъв смисъл - при създаването на Person той си взема номерче, при освобождаването си го освобождава това номерче, обаче това означава, че при копирането също трябва да си взема номерче, защото копието реално създава нов обект, който ако не си е взел номерче ще има повече освобождавания отколкото вземания - тоест правим деструктор, който бута някакъв ресурс (номерът), което ни принуждава да правим същото и при копиране, а има две копирания (copy constructor и copy-assignment operator) -> rule of three.

Поздрави,

Жоро

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.