Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Jovanna avatar Jovanna 186 Точки

при дифолтни TheBig3: не се ли копират битовете на other.обект върху битовете на this->обект ?

Здравейте,

принципно, като се вика copy-assignment оператор или copy-конструктор, не се копират битовете на едните полета върху другите , защото се следва разписаната логика на тези методи, Но, ако са дифолтни, не се ли копират директно битовете на other.обект върху битовете на this->обект?

Поздрави!

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

Здравей,

Не, не се копират по битове. На всяко поле поотделно му се вика съответното нещо:

- default copy constructor вика на всеки един член copy constructor, като му подава съответстващото поле от other

- default copy assignment operator вика на всеки един член copy assignment operator, като му подава съответстващото поле от other

Много лесно може да го тестваш - направи един клас Body, на който в (примерно) copy constructor-а му сложи един cout. След това направи Person клас, който има Body поле и нищо друго не добавяй в този Person. След това направи един Person p; и след това Person copyPerson(p); - ще видиш, че се вика cout-а, който си добавила в copy constructor-а на Body.

Това ти илюстрира и причината да не се копират директно битовете - copy конструкцията на един обект е много вероятно да е по-сложна от просто копиране на битове (в нашия пример copy constructor-а печата на конзолата, което поведение ще се изгуби ако просто се копират битове - може ти да искаш при всяко copy на Body примерно да пазиш информация за дебъгване някъде, която ще я изгубиш ако Person обекта не вика copy constructor-а на Body като се копира).

Още по-сериозен е примерът ако имаш class Student в който имаш vector<int> examScores. Какво ще стане ако при копирането на един Student просто му се копираха битовете? Ами щяхме да имаме 2 Student обекта, които имат вектори, които сочат към една и съща памет, защото щяха да се копират вътрешните указатели, които vector класа ползва, вместо да се задели нова памет в която да се копират данните на examScores и копието да сочи към тях.

Иначе в C++ има функции, наследени от C, които правят тези неща - копиране на памет просто като битове (memcpy), изтриване на памет без викане на деструктори (free) и заделяне на памет без викане на конструктори (malloc) - всичките тези обаче не е препоръчително да ги ползваш, особено ако заделяш памет за обекти, на които конструкторите, деструкторите и copy операциите им са сложни (или ако някой то членовете на тези обекти имат нещо от изброените).

Поздрави,

Жоро

1
niagara avatar niagara 22 Точки

Ако говориш за Company* companiesArray мисля, че просто сочат към една и съща памет, затова когато other се delete-не се освобождава паметта и ти прави проблеми

0
Jovanna avatar Jovanna 186 Точки

не, чудя се съвсем директно какво се случва в паметта при работа с дифолтните TheBigThree, струва ми се че отделните полета се презаписват по битове, незнам:

Lecturer(const Lecturer& other)

  : rating(other.rating), name(other.name) {}

  ...

  Lecturer& operator=(const Lecturer& other) {

    if (this != &other)

    {this->rating = other.rating; this->name = other.name;}

    return *this;

  }

 

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