Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы, :::::::::::::::::::::::::::::::: 
:(
    Опции темы
xach
  Дата 19.3.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



Привет Друзья
Возник вопрос:
(для классов)

В чём существенная разница между конструктором копирования и
перегруженной операцией "=".
И что лучше.
В моём понимании они взаимозаменяемы...
(Небольшая разница будет в некоторых случаях, в оформлении)
Поправьте если не так.

smile
PM MAIL   Вверх
np9mi7
Дата 20.3.2005, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



smile


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Artiom
Дата 20.3.2005, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Конструктор для объекта вызывается один раз, а = можно хоть в каждой строке писать.


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
Олег М
Дата 20.3.2005, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(xach @ 19.3.2005, 22:14)
В моём понимании они взаимозаменяемы...

Не совсем. Операция присваивания будет работать немного дольше, по сравнению с вызовом конструктора, - т.е. сначала таки выполняется конструктор объекта (например который по-умолчанию), и только потом вызывается функция =. Таким образом, в случае конструктора копирования, экономим на вызове других конструкторов
PM MAIL ICQ   Вверх
Goryachev
Дата 20.3.2005, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

Репутация: нет
Всего: нет



Чо то вы все гоните. Copy constructor и перегружения оператора "=" две разные вещи и вообще не связаны.
Код

class A; //допустим где-то написан.

A A1;
A A2(A1); //Copy constuctor in work
A A3=A1; //Copy constuctor in work

A1=A3; //operator= in work

PM MAIL   Вверх
Fire-Plug
Дата 24.3.2005, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(Goryachev @ 20.3.2005, 22:46)
Copy constructor и перегружения оператора "=" две разные вещи и вообще не связаны


Зато аргументы у них одного и того же вида! smile
Код

(const T& ref) // T - typename 

--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Goryachev
Дата 26.3.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

Репутация: нет
Всего: нет



Цитата(Fire @ 24.3.2005, 08:55)
Зато аргументы у них одного и того же вида!

Сто пудово. Поэтому, в большинстве случаев, пишется одна приватная функция, которая вызывается и из copy constructor и из operator=. smile

Я имел ввиду в том, что они разные по значению, и не взаимнозаменяемы.
Если есть copy constructor, а нету operator=, и в классе динамически выделяется память,
то:
Код

class A;

A A1,A2;

A1=A2;


никогда правильно работать не будет.

Это сообщение отредактировал(а) Goryachev - 26.3.2005, 13:25
PM MAIL   Вверх
xach
Дата 30.3.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 22.10.2004
Где: СПб

Репутация: нет
Всего: нет



А как на счёт такого:
Перегружено "=" и
есть дефольтный конструктор (может даже ваш, но не копирования).

Код

class tmp
 {
   public:
    tmp();
    tmp operator=(const tmp &b);
 };

void main()
 {
   tmp x,y=x;
 }

Разве не:
конструктор, а затем "="

и всё будет тип-топ даже в случае динамической памяти?

PM MAIL   Вверх
azesmcar
Дата 30.3.2005, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Нет, в твоем случае вызывается конструктор копирования по умолчанию...оператор = будет вызываться в случае
Код

tmp x, y;
x = y;

конструктор копирования имеет смысл писать если у тебя выделяется динамическая память в классе...например пишешь класс string. если написать то что ты написал вызоветься дефаулт конструктор копирования, и для y -а не выделится динамическая память, а указатель будет ссылаться на память в классе X. после удаления X твой y вылетет...
PM   Вверх
Goryachev
Дата 30.3.2005, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

Репутация: нет
Всего: нет



Цитата(xach @ 30.3.2005, 11:32)
void main()
Код

   tmp x,y=x;



xach
Посмотри выше. Здесь вызывается copy constructor
PM MAIL   Вверх
Олег М
Дата 30.3.2005, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(Goryachev @ 30.3.2005, 16:07)
xach
Посмотри выше. Здесь вызывается copy constructor

А если он не определён явно, то вызовется коструктор по-умолчанию и затем оператор присваивания, или что? По моему вопрос стоял так
PM MAIL ICQ   Вверх
np9mi7
  Дата 30.3.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



xach, ты бы постыдился такие вопросы задавать.... почитай Страуструпа... 10 глава

Это сообщение отредактировал(а) np9mi7 - 30.3.2005, 16:10


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Goryachev
Дата 30.3.2005, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 23.2.2005
Где: Израиль

Репутация: нет
Всего: нет



Цитата
А если он не определён явно, то вызовется коструктор по-умолчанию и затем оператор присваивания, или что? По моему вопрос стоял так


Вызовется коструктор по-умолчанию и ФСЕ!!! smile
PM MAIL   Вверх
Олег М
Дата 31.3.2005, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(Goryachev @ 31.3.2005, 00:50)
Цитата (Олег М @ 30.3.2005, 15:35)
А если он не определён явно, то вызовется коструктор по-умолчанию и затем оператор присваивания, или что? По моему вопрос стоял так



Вызовется коструктор по-умолчанию и ФСЕ!!! 

smile Вижуал С++ в этом случае побитно копирует!
PM MAIL ICQ   Вверх
Fire-Plug
Дата 31.3.2005, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2005

Репутация: -1
Всего: 0



Цитата(xach @ 19.3.2005, 22:14)
В чём существенная разница между конструктором копирования и
перегруженной операцией "=".
И что лучше


Самое лучшее - это список инциализации конструктора! smile
Иначе без него при инциализации объектов-членов сначала пришлось бы вызывать конструктор по-умолчанию, а затем оператор присваивания. А благодаря списку инциализации - один только конструктор копирования. Виват Страуструпу! smile
--------------------
Объясни другому - поймешь сам (Народная примета)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.