Конструктор копіювання є конструктором особливого типу: він приймає як параметр константне посилання на об'єкт класу (const тип_класу &) чи просте посилання на об'єкт (тип_класу &). Наприклад:
Class Card
{int x,y;
public:
Card(const Card & src);};
Card::Card(const Card & src)
{x=src.x;
y=src.y;}
Розглянемо застосовність конструкторів копіювання. Напишемо програму:
#define LARGE 30000
Struct Large
{int data[LARGE];
Large (void)
{for(int i=0;i<LARGE;i++)
data[i]=i;}
~Large(void){}
Large slow(Large b)
{Large ans;
{for(int i=0;i<LARGE;i++)
ans.data[i]=b.data[i];
return ans;}};
Main()
{Large a,b;
{for(int i=0;i<100;i++)
a.slow(b);};
Час її роботи порівняно тривалий. Як збільшити швидкодію? Це можна зробити з використанням конструктора копіювання:
Class Large1
{private:
Large1(const Large1 & b);
public:
int data[LARGE];
Large1(void)
{for(int i=0;i<LARGE;i++)
data[i]=i;}
~LARGE1(void){}
Large1 fast(const Large1 &);
};
Large1::Large1(const Large1 & b);
{for(int i=0;i<LARGE;i++)
data[i]=b.data[i];}
inline Large1 Large1::fast(const Large1 & b)
{return Large1(b);}
Main()
{Large1 a,b;
for(int i=0;i<100;i++)
a.fast(b);};
Ця версія програми, що використовує конструктор копіювання, працює значно швидше, адже за рахунок конструктора копіювання не створюються локальні копії структур. Конструктор у закритій частині опису класу використовується для прискорення оператора return у fast. Це можна пояснити тим, що дані, розміщені в закритому розділі класу, у даному випадку містяться в одному сегменті, і доступ до них здійснюється з використанням near -адресації, тобто одного лише зміщення.
|
|