Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по ППВиС (17 шт, ppt) Романов ВИ 2011 1ый семестр / Л4_Классы и сокрытие данных_Дружественные функции

.ppt
Скачиваний:
48
Добавлен:
15.06.2014
Размер:
596.48 Кб
Скачать

1

Классы и объекты

Продолжаем разговор…

2

Статические переменные внутри класса

В стандарте языка С++ нет никаких ограничений по использованию статических переменных внутри классов.

Однако в реализации объявление статических переменных внутри классов приводит к ошибке на стадии линковки.

Для предотвращения данного эффекта следует пользоваться

следующей записью:

 

#include "iostream“

 

using namespace std;

Результа

class Cl {

т

static int n;

 

public:

Cl() { n++; cout << "Object #" << n << endl; }

};

int Cl::n=0;

void main()

{ Cl obj1, obj2, obj3; }

3

Массивы объектов

При описании объектов при помощи классов программистом создается новый тип данных, а переменная этого типа (экземпляр) и есть объект.

Если рассматривать класс как новый тип данных, то в языке С++ можно создавать массивы объектов. Синтаксис – традиционен для языка С++.

Если задан произвольный класс Cl, то для создания одномерного массива объектов можно воспользоваться следующей записью:

class Cl { …};

void main()

{ Cl obj1[10]; }

Данная запись относится к случаю, когда в классе описан конструктор с аргументами по умолчанию.

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

4

Массивы объектов - пример

#include "iostream"

using namespace std; class Cl {

int n; public:

Cl(int k) { n = k; }

void print () {cout << "Elem =" << n << endl; }

};

void main()

{

Cl obj1[4] = { Cl(1), Cl(2), Cl(3), Cl(4) };

Доступ к открытым членам класса при описании массивов объектов производится через явное указание элемента массива и оператора точка:

obj1[3].print ();

obj1[3].print();

}

Если конструктор имеет только один аргумент, то запись можно сократить:

Cl obj1[4] = {1, 2, 3, 4 };

5

Указатели и ссылки на объекты

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

void main()

{

Cl obj1[4] = { Cl(1), Cl(2), Cl(3), Cl(4) }; Cl* ptr;

ptr = &obj1[3]; ptr->print();

}

6

Указатели и захват динамической памяти

Для доступа к компонентам класса

Cl* ptr;

по указателю используется оператор (->).

ptr = new Cl;

Если был объявлен указатель на

ptr->print();

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

delete ptr;

можно выделить динамическую память под

объект:

Cl* ptr;

Если конструктор имеет

аргументы, то при выделении памяти

ptr = new

под объект можно производить

Cl(1,2);

динамическую инициализацию путем

ptr->print();

передачи аргументов конструктору:

delete ptr;

 

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

При удалении объекта при помощи оператора delete происходит автоматический вызов деструктора.

При использовании ссылок на объекты в качестве аргументов функции встречаются ситуации, при которых нежелательны какие-либо изменения открытых компонентов класса. Для этого при описании ссылки ставится
спецификатор const, говорящий о том, что
компоненты данного
объекта изменить нельзя.

7

 

Ссылки на объекты

В С++ можно объявлять ссылки на

объекты.

рассмотренных на предыдущей

лекции, когда деструктор содержит освобождение памяти и приходится применять конструктор копирования. Чтобы обойти такие ситуации можно использовать ссылки на объекты. Важно: при использовании ссылок не происходит создания копии объектов, а

соответственно не происходит и вызова деструктора копии!

#include "iostream“ using namespace std; class Cl {

public: int n;

Cl(int k) { n = k; }

void print () {cout << "Elem =" << n << endl; }

};

void func (const Cl &ob) { ob.n++; //ERROR!!! ob.print(); //ERROR!!!

}

void main() { Cl ob1; func(ob1); }

8

Указатель this

В памяти для каждого располагаемого объекта создается специальный уникальный указатель. Этот указатель делается доступным путем использования ключевого слова this. Правила:

каждому объявляемому объекту соответствует свой скрытый this- указатель;

this-указатель может быть использован только для нестатической функции;

this указывает на начало своего объекта в памяти;this не надо дополнительно объявлять;

this передается как скрытый аргумент во все нестатические (не имеющие спецификатора static) компоненты-функции своего объекта;

указатель this – локальная переменная и не доступна за пределами объекта;

обращаться к скрытому указателю можно this или *this.

9

Указатель this - пример

#include "iostream"

using namespace std; class Cl {

public: int n;

Cl(int n) { this->n = n; }

void print () {cout << "Elem =" << n << endl; } };

void main()

{

Cl ob1;

}

10

Указатель this - пример

#include "iostream"

 

using namespace std;

А где здесь

class Cl {

ошибка?

public:

 

int n;

 

Cl(int n) { this->n = n; }

 

void print () {cout << "Elem =" << n << endl; }

};

void main()

{

Cl ob1;

}