- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Int (*matrix)[10];
- •Void main(void)
- •Void incr(int &aa)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
Имя_класса имя объекта;
Например, можно объявить объекты класса V_3d следующим образом:
V_3d d, b, c, *a=&d, &a1;
Здесь
d, b, c – объекты класса;
*а – указатель на класс;
a1 – ссылка на класс.
Для доступа к данным конкретного объекта используется конструкция:
Имя объекта. Имя элемента
Например, можно явно присвоить значения элементам объекта d класса V_3d:
d.x=1.34; d.y=5.8; d.z=8.5;
Объекты классов могут быть присвоены (если не было запрещено копирование), переданы как аргументы функции и возвращены функцией.
Действия с объектами класса выполняются с помощью методов класса.
3.5. Методы классов
Функции, объявленные внутри класса, называются его методами. Функции-методы работают с объектами класса, для которых они вызываются.
В листинге 3.1 функция – метод класса mod() ,была, как объявлена внутри класса, так и определена. Это удобно для небольших функций. В общем случае определение функции может располагаться вне класса. В этом случае компилятору следует указать, к какому именно классу принадлежит определяемая функция. Для определения функции вне класса в общем случае используется конструкция:
тип_возврата имя_класса ::имя_функции( )
{
тело функции
}
Последовательность символов в виде двойного двоеточия :: называется операцией области видимости (или принадлежности), она показывает, к какому классу принадлежит функция. Например, в листинге 3.3 показано, как записать определение функции mod() вне класса V_3d:
Листинг 3.3.
// определение функции mod()
double V_3d:: mod( ) //операция :: означает, что функция mod()
// принадлежит классу V_3d
{
return sqrt (x*x+y*y+z*z);
}
В С++ несколько различных классов могут использовать одинаковые имена функций. Компилятор знает, какая из них принадлежит какому классу благодаря операции области видимости и имени класса.
Следовательно, все методы находятся в сфере действия своего класса, даже если они определены вне этого класса.
Вызов метода класса осуществляется с помощью следующей конструкции:
Имя_объекта. Имя_метода( );
Например, вызов функции mod() для объекта d может быть записан так:
d.mod( );
Передавать аргументы, то есть элементы-данные класса функции-методу не надо, так как они ей доступны по умолчанию. Для обращения к элементу класса внутри тела функции-метода класса достаточно использовать только имя элемента.
При вызове функция метод класса получает один скрытый аргумент -указатель на объект, для которого она вызвана. Этот указатель-this. В каждой функции класса этот указатель описан неявно как
Имя класса *this;
this инициализируется так, что он указывает на объект, для которого была вызвана функция, в примере вызова метода d.mod() для объекта d this=&d.
Функция-метод класса может вызываться и через указатель на объект, например, если указатель а инициализирован адресом объекта d, то вызов функции mod() может быть записан так:
a->mod( );
Очень удобно использовать указатель this в тех случаях, когда в теле принадлежащей классу функции нужно явно задать адрес того объекта, для которого она вызвана. Например, это может быть функция, включающая конкретный объект класса в список.
3.6. Конструкторы
Данные, описанные внутри класса, как правило, имеют атрибут доступа private. Это означает, что данные класса доступны только методам этого класса. В таком случае следует предусмотреть функцию –метод класса для инициализации данных.
Функция создания и инициализации объектов данного класса называется конструктором.
Конструкторы обладают большинством характеристик обычных методов – их следует объявить и определить в пределах класса, либо объявить в классе, но определить вне его. Однако они обладают некоторыми уникальными свойствами:
конструкторы имеют то же имя, что и класс;
не имеют объявлений возврата (даже void);
не могут быть унаследованы, хотя производный класс может вызывать конструкторы базового класса;
вызвать конструктор тем же образом, что и обычную функцию – метод класса, нельзя. Конструктор вызывается неявно, при создании или копировании объекта данного класса.
Можно сказать, что конструктор превращает фрагмент памяти в объект того типа, который предусмотрен определением класса.
Конструкторы глобальных переменных вызываются до вызова функции main(). Локальные объекты создаются, как только становится активной сфера действия переменной.
3.7. Параметры конструктора
С помощью параметров конструктору могут быть переданы любые данные, необходимые для создания и инициализации объектов. Параметры конструктора могут быть любого типа, за исключением класса, элементом которого является данный конструктор (но ссылку на собственный класс можно использовать в качестве параметра конструктора). Формат определения конструктора в теле класса может быть таким:
