Федеральное агентство по образованию
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра автоматизированных систем управления (АСУ)
Высокоуровневые методы информатики и програмирования
Лабораторная работа № 1
Студент
Специальности 80801
« 23 » апреля 2009 г.
«___» __________ 200_ г.
2009
Тема : Классы. Открытые и закрытые уровни доступа. Конструкторы. Инициализация данных объекта. Определение методов. Создание обекта в памяти.Стандартные потоки ввода-вывода.
Классы
Классы в С++ - это структуры, в которых вместе с данными определяются функции. Класс (class) - это тип, определяемый пользователем, включающий в себя данные и функции, называемые методами или функциями-членами класса.
Данные класса - это то, что класс знает.
Функции-члены (методы) класса - это то, что класс делает.
Таким образом, определение типа задаваемого пользователем (class) содержит спецификацию данных, требующихся для представления объекта этого типа, и набор операций (функций) для работы с подобными объектами.
2.2 Обьявление класса
Приведем пример объявления класса.
class TCounter {
long count; // данные класса
public:
long GetValue(); //функции-члены класса
void SetValue(long);
};
Определение класса начинается с ключевого слова class за которым следует имя класса. Имя может иметь до 32 символов, причем различаются строчные и прописные буквы. Открывающая и закрывающая фигурные скобки определяют тело класса, в которое включено описание данных и функций класса. Заканчивается описание класса символом ;. Класс имеет столько переменных (данных), сколько необходимо. Переменные могут быть любого типа, включая другие классы, указатели на классы и указатели на динамически распределяемые объекты. Переменные объявленные внутри класса имеют область видимости класса, т.е. от точки объявления переменной до конца класса.
Открытые и закрытые уровни доступа
Для ограничения уровня доступа к данным и функциям-членам класса в С++ существуют три ключевых слова private: (частный), protected: (защищенный), public: (общедоступный), задающие разделы поступа в классе. Каждый раздел в классе начинается с одного из приведенных слов. Если ни одно из ключевых слов не использовалось, то все объявления в классе считаются частными. Разделы с разными привилегиями доступа могут появлятся в любом порядке и в любом колличестве. Рассмотрим пример.
class Example {
int x1; // частные по умолчанию
int f1(void);
protected:
int x2; // защищенные
int f2(void);
private:
int x3; // опять частные
int f3(void);
public:
int x4; // общедоступные
inf f4(void);
};
Частные члены класса имеют наиболее ограниченный доступ. К частным членам класса имеют доступ только функции-члены данного класса или классы и функции объявленные как дружественные (friend) к данному классу, например:
class TPrivateClass {
int value;
int GetValue(void);
};
int TPrivateClass::GetValue(void) {
return value; //доступ разрешен
}
void main(void) {
TPrivateClass cl; //создание объекта
int i = cl.value; //ошибка! Нет доступа
i = cl.GetValue();//ошибка! Нет доступа
}
Защищенные члены класса
Члены и функции объявленные в защищенном (protected) разделе класса доступны только для функций производных классов. Обычно в этом возникает необходимость тогда, когда разрабатываемый класс является базовым классом для других классов. В этом случае он ограничивает доступ к данным внешним пользователям и разрешает доступ для классов наследников. Рассмотрим пример иерархии объектов.
class A {
protected:
int val;
};
class B: public A { //наследуется от A
public:
void fb();
};
void B::fb() { val = 0; } //доступ разрешен
class C:public B { //наследуется от B
public:
void fc();
};
void C::fc() {val = 10;} //доступ разрешен
В данном примере приведена иерархия классов A->B->C. Свойство защищенности распространяется вниз по иерархии до тех пор пока производный класс объявляет свой базовый общедоступным (public). При этом любые функции-члены в классах C и B имеют доступ к члену данных val базового класса. Если функция-член производного класса в качестве входного параметра имеет указатель или ссылку на объект базового класса, то правила становятся другими. Модифицируем класс C следующим образом.
class C:public B {
public:
void fc(A&); //Входной параметр ссылка на базовый класс
};
void C::fc(A& a) {
val = 10; //доступ разрешен
a.val = 10; //ошибка! нарушение прав доступа
}
Общедоступные члены класса
C общедоступными членами класса все обстоит намного проще. Доступ к общедоступным членам класса разрешен функциям-членам самого класса, производных классов и обычным пользователям класса.
Конструкторы. Инициализация данных объекта.
Как и любая переменная программы, объект должен быть размещен в памяти (создан) и удален из памяти (уничтожен). Причем создание и уничтожение объектов выполняется статически или динамически.
Статическое создание объектов выполняется в процессе компиляции программы, а статическое уничтожение − при завершении программы: объект удаляется из памяти вместе с программой.
Динамическое создание и уничтожение объектов выполняется в процессе работы программы специальными командами.
Операция создания и инициализации полей объекта получила название конструирования объекта, а операция уничтожения объекта − деструкции объекта. Соответствующие методы, если они определены в классе, получили название конструкторов и деструкторов.
В языке С++ конструктор имеет тоже самое имя, что и имя класса и не может иметь какой-либо определенный возвращаемый тип, поскольку имеет заранее определенный возвращаемый тип - указатель на инициализируемый объект.
Следует отметить, что функция конструктора запускается на этапе описания (декларирования) объекта. Т.е. декларирование объекта MyObject класса CMyObject следующей строкой
CMyObject MyObject;
В языке С++ Деструктор имеет тоже имя, что и имя класса с предшествующей ему тильдой. Деструктор не имеет никакого возвращаемого типа.