
- •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.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
2.1. Перегрузка имен функций
Компилятор С++ различает функции не только по именам, но и по типу аргументов. Если функции выполняют одни и те же действия над объектами различных типов, то целесообразно им дать одно и то же имя.
Пример использования этого механизма приведен в листинге 2.1.
// Листинг 2.1. Перегрузка имен функций
#include <stdio.h>
//Прототипы трех функций с одним и тем же именем и разными
//типами параметров
void print(int i);
void print(long i);
void print(double i);
int main(void)
{
print(200);
print(2000000L);
print(3.14159);
return 0;
}
void (int i)
{
printf("%d\n",i) ;
}
void print(long i)
{
printf("%ld\n",i) ;
}
void print(double i)
{
printf("%lf\n",i) ;
}
В листинге 2.1 показано использование трех функций с именем print() и с различными типами аргументов. Вызов функции print() компилятор свяжет с тем или иным ее определением в зависимости от типа переданного аргумента.
Примечание.
Компилятор не различает функции по типу возвращаемого значения, поэтому перегружаемые функции не могут иметь различные типы возвращаемого значения, например ошибочными являются следующие объявления:
Int print(int);
Void print(int);
2.2. Динамическое распределение памяти
Для распределения памяти под динамические данные в процессе исполнения программы можно использовать библиотечные функции языка С malloc(), farmalloc() и другие. Неудобство их заключается в том, что программист вынужден заниматься сам расчетами по выделению необходимого объема памяти.
В С++ для этого предлагается унарный оператор new, синтаксис которого имеет вид:
Указатель на тип = new имя<(инициализатор)>;
Оператор new создает в памяти объект, тип которого определяется операндом и возвращает указатель на объект.
Например, объявление:
int *ip=new int;
создаст динамический неинициализированный объект целого типа, а объявление
int *ip=new int(3);
создаст динамический объект целого типа с инициализацией его значением 3.
Освободить память, распределенную операцией new, можно с помощью оператора delete, например
delete ip;
Удаление указателя означает освобождение выделенной памяти для последующего ее использования.
Примечание.
Память, полученная оператором new, будет распределена до тех пор, пока она явно не будет освобождена оператором delete. Это очень важный момент, так как при выходе из блока локальный указатель, содержащий адрес памяти, полученный оператором new, уничтожается, тогда, как память остается распределенной, т.е. автоматически она не освобождается. В результате к этой памяти невозможно будет обратиться.
Часто new используется для динамического распределения памяти под массив, например:
double *a;
int n=10;
a=new double[n];
или:
double *a= new double[10];
Здесь [] указывают, что распределяется память под массив объектов, а не под простую переменную.
Закончив использование массива, следует удалить его:
delete[] a;
При объявлении указателя на двух- или трехмерный массив следует указать количество элементов во второй и последующих позициях, например: