progs.biz  
Начало>C/C++>Основы C++>Урок 43
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

Алексей Дубовцев Microsoft .NET. Наиболее полное руководство.
Алексей Дубовцев Microsoft .NET. Наиболее полное руководство.
Заказать на Озоне



Яндекс-цитирования

C/C++
Урок 43. Конструктор копирования

Конструктор C++ при копировании одного объекта в другой работает поэлементно. То есть в переменные экземпляра класса, в который производится копирование, копируются значения из соответствующих переменных экземпляра класса, который копируется. Чаще всего нам именно такое поведение и надо - но не всегда. Например, если у нас в классе есть указатель на экземпляр другого класса, то при таком способе копируется именно указатель, т. е. в двух копиях нашего класса указатель будет указывать на одну и ту же область памяти - что нам, скорей всего, не нужно. Для того, чтобы избежать это, мы долны написать для нашего класса конструктор копирования, в котором и определить способ копирования одного экземпляра нашего класса в другой.

Вот пример класса с конструктором копирования:

#include <iostream.h>

class B{
public:
    int k;
    B(){
        k = 0;
    }
};

class SomeClass{
public:
    B *b;
    SomeClass(){
        b = new B;
    }
    // Конструктор копирования.        
    SomeClass(const SomeClass & w){
        this->b = new B;
        this->b->k = w.b->k;
    }
    
};
void main(){
    SomeClass q;
    SomeClass q1 = q; // Вызов конструтора копирования.
    q1.b->k = 3;
    cout << q.b->k;
}

Ситуация тут такая - в классе SomeClass есть указатель на класс B. В main мы создаем два экземпляра нашего класса SomeClass, и копируем один экземпяр в другой. Но при нашем копировании указатель на класс B не будет напрямую копироваться (т. е. адреса указателей на B у разных экземпляров класса SomeClass будут разные). И, как следствие, поменяв значение экземпляра класса B в одном экземляре класса SomeClass (в нашем случае q1) мы не поменяем значение экземпляра класса B в другом экземпляре класса SomeClass (в экземпляре q).

Таким образом наша программа выведет 0. А без определения конструктора копирования она бы вывела 3.

Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев