Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонюк и др.doc
Скачиваний:
49
Добавлен:
07.11.2018
Размер:
32.99 Mб
Скачать

Структура как простейший класс.

Структура в С++ напоминает простейший класс. Рассмотрим пример:

#include <iostream.h>

#include <math.h>

struct math_operation

{

double data;

void setValue(double ang){data=ang;}

double getSquare(){return data*data;}

double getSquareRoot{return sqrt(data);}

}

math_operation math;

int main()

{

math.setValue(35.63);

cout<<”x^2=”<<math.getSquare();

cout<<”square root=”<<math.getSquareRoot();

return 0;

}

Внутри структуры содержатся описания данных и функций-членов.

В данном примере имеется единственный элемент данных “double data” и три функции-члена.

Синтаксис и правила для классов С++.

Описание класса С++ начинается с ключевого слова class. Оформление определения класса очень похоже на описание struct.

class имя_класса

{

тип переменная1;

тип переменная2;

функция-член1

функция-член2

public:

тип переменная3;

тип переменная4;

функция-член3

функция-член4

};

По умолчанию члены класса являются частными (private). Они доступны только функциям-членам. После объявления public следуют данные и функции, доступные внешним для класса функциям. Предыдущий пример должен быть записан следующим образом:

#include <iostream.h>

#include <math.h>

class math_operation

{

double data;

public:

void setValue(double ang){data=ang;}

double getSquare(){return data*data;}

double getSquareRoot(){return sqrt(data);}

}

math_operation math;

int main()

{

math.setValue(35.63);

cout<<”x^2=”<<math.getSquare();

cout<<”square root=”<<math.getSquareRoot();

return 0;

}

Теперь к переменной data доступ возможен только через функции-члены класса.

Внутри описания класса может быть указан только прототип метода. Сам метод может быть написан вне описания и даже в другом файле. В этом случае заголовок метода выглядит следующим образом:

возвращаемыйТип имяКласса::имяМетода(список аргументов){код метода}

Inline методы.

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

Пример:

inline double math_operation::getSquareRoot()

{

return sqrt(data);

}

Действует следующее соглашение, если код метода написан непосредственно внутри описания класса, то он автоматически считается inline.

Указатель this.

При описании класса автоматически объявляется переменная с именем this. Она указывает на текущий экземпляр класса:

ИмяКласса *this;

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

Конструкторы и деструкторы.

Особенность ООП в том, что некоторые методы выполняются неявно. К ним относятся конструктор и деструктор.

Конструктор используется для инициализации переменных класса и для выделения памяти под динамические массивы. Он выполняется автоматически при создании представителя класса. Конструктор имеет имя, совпадающее с именем класса. Тип возвращаемого результата для конструктора не указывается. Одновременно может быть определено несколько конструкторов, которые отличаются количеством и типом аргументов. Имеется как минимум два конструктора

  1. конструктор без параметров (используемый по умолчанию) и

  2. конструктор, создающий копию объекта (копиконструктор).

Если они не включены в описание класса, то компилятор создает их самостоятельно.

Деструктор вызывается при уничтожении объекта. Он обычно используется для освобождения памяти. Деструктор имеет имя, совпадающее с именем класса, но впереди имени ставится знак ‘~’ (тильда), параметров не имеет.

Примеры:

class coins

{

int number;

public:

coins(){number=0;}

coins(int n){number=n;}

coins(coins &c){number=c.number;}

~coins(){cout<<”Finish\n”;}

int convertToRoubles(){return number*0.01;}

};

class stringOperation

{

char *str;

int lenght;

public:

stringOperation(){str=NULL;n=0;}

stringOperation(int n){str=new char[n];lenght=n;}

stringOperation(stringOperation &a)

{

this(a.n);

memcpy(str,a.str,n);

}

~stringOperation(){delete str;}

void indata()

{

cin>>lenght;

for(int i=0;i<lenght;i++)cin>>str[i];

}

void outdata()

{

cout<<lenght<<newline;

for(int i=0;i<lenght;i++)cout<<str[i];

cout<<newline;

};