Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос по классом


Автор: knut 19.9.2006, 15:39
Всем доброго времени суток smile 
Зачем классу иметь несколько констукторов копи?

Автор: EvgenZ 19.9.2006, 16:18
Конструктор копирования может быть только один!!! Или может ты имеешь ввиду что-то другое?

Автор: Romikgy 19.9.2006, 16:27
Цитата(knut @  19.9.2006,  14:39 Найти цитируемый пост)
Зачем классу иметь несколько констукторов копи? 

дабы можно было создавать класс от нескольких исходных данных,
например можно создать класс для работы со строками , дык его можно будет создать и от char * и от самого класса и еще от допустим инта , флоата и т.п.

Автор: knut 19.9.2006, 16:29
EvgenZ
Цитата

Конструктор копирования может быть только один!!! Или может ты имеешь ввиду что-то другое? 


Ты xочеш сказать что у класса не может быть два или болше конструктора копи? это почему?

Автор: bel_nikita 19.9.2006, 16:31
myclass(const myclass& cop);

Автор: Romik_Yarosh 19.9.2006, 16:43
Цитата(Romikgy @  19.9.2006,  16:27 Найти цитируемый пост)
дабы можно было создавать класс от нескольких исходных данных,
например можно создать класс для работы со строками , дык его можно будет создать и от char * и от самого класса и еще от допустим инта , флоата и т.п. 

да чет , немного спутал с обычным конструктором smile

PS их бин Romikgy

Автор: knut 19.9.2006, 16:43
bel_nikita
Цитата

myclass(const myclass& cop); 

извини конечно ну что это?

Автор: MAKCim 19.9.2006, 16:46
Цитата

извини конечно ну что это? 

копирующий конструктор

Автор: Romik_Yarosh 19.9.2006, 16:47
Цитата(knut @  19.9.2006,  16:43 Найти цитируемый пост)
извини конечно ну что это? 

это и есть копирующий конструктор

Автор: Damarus 19.9.2006, 16:47
Цитата(knut @  19.9.2006,  17:43 Найти цитируемый пост)
извини конечно ну что это?

Это конструктор копирования smile 

Автор: knut 19.9.2006, 16:47
Цитата

myclass(const myclass& cop); 

все понял это для привязки к другому классу.или нет?

Автор: Romik_Yarosh 19.9.2006, 16:53
Цитата(knut @  19.9.2006,  16:47 Найти цитируемый пост)
все понял это для привязки к другому классу.или нет? 

нет для привезки к своему классу

Автор: zkv 19.9.2006, 17:03
Цитата(knut @  19.9.2006,  16:47 Найти цитируемый пост)
Цитата

myclass(const myclass& cop); 

все понял это для привязки к другому классу.или нет? 


Конструктор копирования используется во многих случаях, типичный пример:
Код

 MyClass My1, My2;
 My1.m_someMember = "The some value"
 My2 = My1;//здесь будет вызван конструктор копирования


Компилятор при необходимости (если программист не написал свой) сам "придумывает" конструктор копирования, который просто копирует значения всех членов-данных, но в некоторых случаях это непремлимо, тогда стоит написать свой.

Автор: Damarus 19.9.2006, 17:17
Цитата(zkv @  19.9.2006,  18:03 Найти цитируемый пост)
Конструктор копирования используется во многих случаях, типичный пример:
Код

MyClass My1, My2;
My1.m_someMember = "The some value"
My2 = My1;//здесь будет вызван конструктор копирования

Нет, здесь будет вызван operator =.

Автор: zkv 19.9.2006, 17:21
Цитата(Damarus @  19.9.2006,  17:17 Найти цитируемый пост)
Нет, здесь будет вызван operator =.

да, конечно, скажем так: "Будет задействован конструктор копирования"; Damarus - так правильно? smile

Автор: Damarus 19.9.2006, 17:40
Цитата(zkv @  19.9.2006,  18:21 Найти цитируемый пост)
Damarus - так правильно?

Нет. В твоём примере вызывается конструктор без параметров (2 раза - для My1 и My2) в строке 1. А в строке 3 вызывается:
Код

MyClass& operator = (const MyClass&);

Автор: threef 19.9.2006, 21:00
Код

class T{
   public:
     T(){cout<<"default\n";
     T(const T&copy){cout<<"copy\n";
     ~T(){cout<<"ded\n";}
    T& operator =(const T copy)
    {
      cout<<"=\n";
   } 
}

T f(T tt) 
{
   T a=tt,b;// вызывается copy  и default
   b=tt;// вызывается =
   return b;// вызывается copy
} //вызывается 3 ded

main()
{
      T x;// вызывается default
      f(x);// вызывается copy  и ded
      T y= f(x);// вызывается 2 copy и ded
}  //вызывается 2 ded




Автор: zkv 20.9.2006, 17:42
Цитата(Damarus @  19.9.2006,  17:40 Найти цитируемый пост)
Цитата(zkv @  19.9.2006,  18:21 Найти цитируемый пост)
Damarus - так правильно?

Нет. В твоём примере вызывается конструктор без параметров (2 раза - для My1 и My2) в строке 1. А в строке 3 вызывается:
Выделить всёкод C++
1:
    
MyClass& operator = (const MyClass&);

Damarus, конечно ты прав,  что то поперепутал все в голове, еще и с советами полез smile,
в моей книжке написано:
Цитата

Конструктор копирования вызывается в следующих случаях:
- при определении нового объекта с инициализацией его другим существующим объектом того 
  же типа;
- при передаче в функцию по значению;
- при возврате по значению оператором return;

про оператор = я, видимо, домыслил сам, не правильно поняв подобный пример:
Код

 T a=tt;

Прошу прощения за дезинформацию. Damarus, спасибо за уместное замечание

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)