Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ / Указатель this.doc
Скачиваний:
106
Добавлен:
02.04.2015
Размер:
145.41 Кб
Скачать

Конструкторы копии и параметры функции

Пусть имеется класс

class myclass {

int *p; // закрытый член – указатель на целое

public:

myclass(int i); // обычный конструктор с параметром

~myclass( ); // деструктор

int getval( ) {return *p}

};

myclass::myclass(int i)

{

cout<<”Выделение памяти в динамической области”<<endl;

p=new int;

*p=i;

}

myclass::~myclass( )

{

cout<<”Освобождение памяти”<<endl;

delete p;

}

и определена функция с параметром

void display(myclass ob)

{

cout<<ob.getval( )<<endl;

}

int main( ) // главная функция

{

myclass a(10);

display(a);

return 0;

}

  • при передаче объекта функции создается побитовая (т.е. точная) копия этого объекта, которая передается параметру функции

  • возможна ситуация, когда идентичная копия нежелательна, например, если оригинальный объект содержит указатель на выделяемую динамическую память

  • в этом случае указатель, принадлежащий копии, также будет ссылаться на ту же область памяти

  • если копия внесет изменения в содержимое этой области памяти, эти изменения коснутся оригинального объекта.

  • Чтобы избежать проблем создается конструктор копии, который позволяет управлять действиями, составляющими процесс создания копии.

  • Конструктор копии вызывается в случае, когда один объект инициализирует другой , например, myclass b=a;

ориги-нальный

объект

объект-копия

int *p

int *p

Без конструтора копирования

ориги-нальный

объект

объект-копия

int *p

int *p

С конструтором копирования

Общий вид конструктора копирования:

имя_класса (const имя_класса &obj)

{

//тело конструктора

}

где obj – ссылка на объект

Дополним класс myclass

myclass(const myclass &ob); // конструктор копии в описание класса

Реализация конструктора копирования

myclass:: myclass (const myclass &obj)

{

p=new int;

p=obj.p; // значение копии

cout<< “Вызван конструктор копии”<<endl;

}

Указатель this

  • Каждый метод класса имеет скрытый параметр – указатель this.

  • Этот указатель содержит адрес текущего объекта.

  • this не может быть описан явно, так как это ключевое слово.

  • Память для указателя thisне выделяется и не освобождается программно. Это делает компилятор.

class x {

int m;

public:

int readm() { return m; }

void writem(int y) {m=y;}

};

x aa;

x bb;

void f()

{

int a = aa.readm();

int b = bb.readm();

...

}

В первом вызове функции-члена readm() член m относится к aa.m, а во втором - к bb.m. Указатель на объект, для которого вызвана функция-член, является скрытым параметром функции. На этот неявный параметр можно ссылаться явно как на this. В каждой функции класса x указатель this неявно описан как

x * this;

и инициализирован так, что он указывает на объект, для которого была вызвана функция член.

Пример использования this

class x {

int m;

public:

int readm() { return this->m; }

};