![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| xach |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
Привет Друзья
Возник вопрос: (для классов) В чём существенная разница между конструктором копирования и перегруженной операцией "=". И что лучше. В моём понимании они взаимозаменяемы... (Небольшая разница будет в некоторых случаях, в оформлении) Поправьте если не так. |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
|||
|
||||
| Artiom |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1031 Регистрация: 11.3.2003 Где: Минск\Баку Репутация: нет Всего: 17 |
Конструктор для объекта вызывается один раз, а = можно хоть в каждой строке писать.
-------------------- Если тебя жизнь трахает, значит, ты ещё живой |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Не совсем. Операция присваивания будет работать немного дольше, по сравнению с вызовом конструктора, - т.е. сначала таки выполняется конструктор объекта (например который по-умолчанию), и только потом вызывается функция =. Таким образом, в случае конструктора копирования, экономим на вызове других конструкторов |
|||
|
||||
| Goryachev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
Чо то вы все гоните. Copy constructor и перегружения оператора "=" две разные вещи и вообще не связаны.
|
|||
|
||||
| Fire-Plug |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Зато аргументы у них одного и того же вида!
--------------------
Объясни другому - поймешь сам (Народная примета) |
||||
|
|||||
| Goryachev |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
Сто пудово. Поэтому, в большинстве случаев, пишется одна приватная функция, которая вызывается и из copy constructor и из operator=. Я имел ввиду в том, что они разные по значению, и не взаимнозаменяемы. Если есть copy constructor, а нету operator=, и в классе динамически выделяется память, то:
никогда правильно работать не будет. Это сообщение отредактировал(а) Goryachev - 26.3.2005, 13:25 |
||||
|
|||||
| xach |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
А как на счёт такого:
Перегружено "=" и есть дефольтный конструктор (может даже ваш, но не копирования).
Разве не: конструктор, а затем "=" и всё будет тип-топ даже в случае динамической памяти? |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Нет, в твоем случае вызывается конструктор копирования по умолчанию...оператор = будет вызываться в случае
конструктор копирования имеет смысл писать если у тебя выделяется динамическая память в классе...например пишешь класс string. если написать то что ты написал вызоветься дефаулт конструктор копирования, и для y -а не выделится динамическая память, а указатель будет ссылаться на память в классе X. после удаления X твой y вылетет... |
|||
|
||||
| Goryachev |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
xach Посмотри выше. Здесь вызывается copy constructor |
||||
|
|||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
А если он не определён явно, то вызовется коструктор по-умолчанию и затем оператор присваивания, или что? По моему вопрос стоял так |
|||
|
||||
| np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
xach, ты бы постыдился такие вопросы задавать.... почитай Страуструпа... 10 глава
Это сообщение отредактировал(а) np9mi7 - 30.3.2005, 16:10 |
|||
|
||||
| Goryachev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
Вызовется коструктор по-умолчанию и ФСЕ!!! |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
|
|||
|
||||
| Fire-Plug |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 15.3.2005 Репутация: -1 Всего: 0 |
Самое лучшее - это список инциализации конструктора! Иначе без него при инциализации объектов-членов сначала пришлось бы вызывать конструктор по-умолчанию, а затем оператор присваивания. А благодаря списку инциализации - один только конструктор копирования. Виват Страуструпу! --------------------
Объясни другому - поймешь сам (Народная примета) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |