
Лекции по ППВиС (17 шт, ppt) Романов ВИ 2011 1ый семестр / Л4_Классы и сокрытие данных_Дружественные функции
.ppt
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 происходит автоматический вызов деструктора.

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;
}