![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Competitor |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 440 Регистрация: 23.3.2005 Где: Tula Репутация: нет Всего: -1 |
Подскажите, где ошибка?
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
не позволительны конструкторы типа ClassName(ClassName)
нужно использовать ClassName(const ClassName&), то есть в твоём конкретном случае нужно писать так :
-------------------- СУВ, Partizan. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Но вообще говоря в твоём случае я бы использовал только конструктор Name1(int), просто передавал бы в ob2 ob1._int:
А такие конструкторы типа Name1(const Name1&) вообще используются для замещения конструктора копирования по умолчанию, который осуществляет всего навсего поверхностное копирование, создавая побитовую копию объекта, которая вряд ли будет пригодной, если в классе содержатся указатели или ссылки. -------------------- СУВ, Partizan. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Первая часть этого предложения в корне не правильная. Не "поверхностное" или "побитовое"(хорошее слово!:)), а хорошее: с вызовом конструкторов копирования полей данного класса. А вот если среди полей указатели и ссылки, то конечно будут проблемы. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Это не я придумал...терминология такая... я лично всегда думал и продолжаю думать, что в С++ различают т.н. "поверхностное" и "глубинное" копирование данных. При "поверхностном"происходит передача только адреса от одной переменной к другой....в результате обе переменных указывают на одну и ту же область памяти...При т.н. "Глубинном" копировании происходит действительное копирование данных из одной области в другую...
Конструктор копирования по умолчанию производит поверхностное коепирование в вышеуказанном смысле... ещё раз говорю, что термины поверхностное и глубинное копирование придуманы не мной... -------------------- СУВ, Partizan. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Partizan
Я с терминологие не спорю. Просто называть "поверхностным", а уже тем более "побитовым" копирование, которое осуществляется через вызовы конструкторов копирования у объектов - это как то не хорошо. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Ну хорошо...назовём это "буквальной" копией объекта...
Возможно я не слишком красиво ывразился, однако, думаю и вы, и, надеюсь, автор этой темы поняли о чём шла речь. Имелось ввиду, что объекты побитово идентичны... Это сообщение отредактировал(а) Partizan - 1.1.2006, 21:51 -------------------- СУВ, Partizan. |
|||
|
||||
| blackofe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
в том-то и дело, что нет. объекты будут побитово идентичны только в том случае, если у класса нет ни членов с определенными конструкторами, ни соответствующих базовых классов. так что в общем случае данное утверждение несправедливо, о чем и пытался сказать Daevaorn. |
|||
|
||||
| Partizan |
|
||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Это сообщение отредактировал(а) Partizan - 4.1.2006, 00:40 -------------------- СУВ, Partizan. |
||||
|
|||||
| blackofe |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
сначала выдержка из msdn: A compiler-generated copy constructor sets up a new object and performs a memberwise copy of the contents of the object to be copied. If base class or member constructors exist, they are called; otherwise, bitwise copying is performed. а вот пример:
результат работы: A(N), an: 10 copy A(), an: 20 10 20 ~A(), an: 20 ~A(), an: 10 Press any key to continue если бы копирование было побитовое, то мы бы получили 10 10 но конструктор копии по умолчанию класса B (мы для него конструктор копии явно не описывали) вызвал конструктор копии класса A, тем самым увеличив значение an в два раза. Это сообщение отредактировал(а) blackofe - 4.1.2006, 00:47 |
||||
|
|||||
| Partizan |
|
||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
в том то и дело, что мы переопределили конструктор копирования....в том же посте речь шла о конструкторе копирования ПО УМОЛЧАНИЮ
Читаем внимательно:
то бишь если видоизменить ваш пример следующим образом:
то мы получаем: A(N), an: 10 10 10 ~A(), an: 10 ~A(), an: 10 Press any key to continue З.ы. ребят...читайте, пожалуйста, посты внимательнее... Это сообщение отредактировал(а) Partizan - 4.1.2006, 01:00 -------------------- СУВ, Partizan. |
||||
|
|||||
| blackofe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
Partizan
тебе тоже не мешало бы читать посты внимательнее. вот этот код
вызывает конструктор копии класса B. мы для этого класса (class B) конструктор копии сами не создавали, уповая на конструктор копии, который создаст компилятор по умолчанию. он создал. но не побитовый, как бы ты хотел, а с вызовом соответствующих конструкторов для членов и для базовых классов. что мы и наблюдаем: конструктор копии по-умолчанию класса B не выполнил побитовое копирование объекта b1, а вызвал конструктор копии члена - объекта типа A. (для него мы написали конструктор копии, чтобы ты мог убедиться: да, конструктор копии по-умолчанию вызывает конструкторы членов и базовых классов, а не выполняет простое побитовое копирование). |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
Всё, спасибо...признаю...был неправ в той части, где говорил о побитовом копировании...
Но утверждение полностью верно в случае отсутствия каких бы то ни было конструкторов... З.ы. поставил бы вам + за такой ценный урок....но не могу...постов не хватает... -------------------- СУВ, Partizan. |
|||
|
||||
| blackofe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
Partizan, свои люди - сочтемся
Добавлено @ 01:42 кстати, такое поведение конструктора копии по-умолчанию весьма ценно. во всяком случае, мы можем быть уверены, что если кто-то воспользуется нашим классом путем агрегирования или наследования, то, даже если он не определит конструктор копирования, компилятор это сделает за него и правильно вызовет наши конструкторы. единственно, мы не застрахованы от того, что пользователь наших классов не напишет конструкторы копирования неправильно. ну, тут уж.. ;) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |