Материал: Программирование на языке высокого уровня Лекции 09.03.01

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

доступ к элементам данных с помощью операций . или ->, применяемых соответственно к представителю или указателю на представитель класса.

Функции-элементы класса могут вызывать другие функцииэлементы того же класса, используя имя функции. Обычные функции или функции-элементы других классов могут вызывать функцииэлементы класса с помощью операций . и ->, применяемых к представителю или указателю на представитель класса.

class ttt { int x,y; public:

void Setxy (int xx, int yy) {x=xx;y=yy;}

void Getxy (int &xx, int &yy) {xx=x;yy=y;}

};

void main(void)

{ttt o1;

ttt *o2=&o1;

o1.Setxy(10,10); int st1,st2; o2->Getxy(st1,st2);

}

Темы 35-38. Специальные функции-элементы класса.

Специальными функциями-элементами называют функции, которые могут вызываться компилятором неявно. Это может происходить при создании и уничтожении представителей класса, при их копировании и преобразовании в другие типы. К таким функциям относятся:

конструктор - инициализирует представитель класса;

конструктор копии - инициализирует новый представитель класса, используя значение уже существующего объекта;

операция присваивания - присваивает содержимое представителя другому представителю класса;

деструктор - производит очистку представителей класса;

операция new - выделяет память для динамически создаваемого представителя класса;

операция delete - освобождает динамическую память, занятую представителем класса;

функции преобразования - преобразуют представитель класса к другому типу.

Конструктор является функцией-элементом с тем же именем, что

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

Программирование на языке высокого уровня 09.03.01

41

то компилятор генерирует конструктор по умолчанию (не имеющий параметров). Для конструктора не указывается возвращаемый тип и он не может возвращать значение. Элементы-данные класса обычно инициализируются в теле конструктора. Однако, определение конструктора может также содержать список инициализации элементов. Список инициализации элементов отделяется двоеточием от заголовка определения функции и содержит элементы данных, разделенные запятыми.

class qqq { int x,y;

public: qqq(int xx, int yy):x(xx),y(yy)

{}

};

Конструктор копии является конструктором специального вида: он воспринимает в качестве аргумента ссылку на объект класса. Ссылка передается всякий раз, когда новый объект инициализируется значениями уже существующего. Если конструктор копии не предусмотрен, то компилятор генерирует конструктор копии по умолчанию. Такой конструктор создает буквальную копию объекта. Если конструктор копии объявлен в разделе private, то компилятор будет генерировать сообщение об ошибке, если кто-то попытается создать копию объекта.

class proverka { int a,b;

public:

proverka (int aa, int bb):a(aa),b(bb)

{}

proverka (const proverka &zaval)

{a=zaval.a;

b=zaval.b;

}

};

void main() { proverka q(10,10); proverka t=q;

}

Операция присваивания является функцией-элементом с именем operator=, которая принимает в качестве своего единственного параметра ссылку или константную ссылку на объект данного класса. Операция присваивания вызывается компилятором, когда объекту присваивается значение другого объекта. Компилятор генерирует присваивание по умолчанию, если операция присваивания не определена явно. Присваивание по умолчанию производит поразрядное копирование.

Программирование на языке высокого уровня 09.03.01

42

class proverka { int a,b;

public:

proverka (int aa, int bb):a(aa),b(bb)

{}

proverka& operator= (const proverka &); };

proverka& proverka:: operator= (const proverka &zaval) { a=zaval.a;

b=zaval.b; return *this;

}

void main()

{proverka q (10,10); proverka w (7,7);

q=w;

}

Конструктор копии отличается от операции присваивания тем, что операция присваивания вызывается, если изменяется содержимое

существующего

объекта, а конструктор копии вызывается, если

новый объект инициализируется значениями другого объекта.

Указатель

this является скрытым параметром, который

передается функции-элементу класса при вызове. Это ключевое слово чаще всего применяется для возврата из функции-элемента указателя или ссылки на текущий объект.

Деструктор является дополнением конструктора. Он вызывается при уничтожении объектов и должен производить необходимую очистку объекта перед освобождением занимаемой им памяти. Именем деструктора должно быть имя класса, которому предшествует тильда

(~). Деструктор не может иметь аргументов, не может возвращать значение и не наследуется.

Объекты класса могут быть преобразованы в другие типы (или созданы из других типов) с помощью операций приведения типа или конструкторов преобразования.

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

class stroka { char *str;

public:

stroka (const char*);

...

};

Программирование на языке высокого уровня 09.03.01

43

void main() {

stroka msg= "Экзамен не сдать.";

...

}

При необходимости программист может запретить вызов конструктора с одним параметром в качестве конструктора преобразования. Для этого в объявлении конструктора должно быть добавлено ключевое слово explicit. Такой конструктор можно будет вызывать только обычным (явным) образом:

stroka msg("Экзамен не сдать.");

В классе можно определять элементы-функции, которые будут обеспечивать явное преобразование типа данного класса в другие типы. Заголовок таких функций имеет вид:

operator имя_типа();

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

# include <stdio.h> class treyg {

int s1,s2,s3;

public: treyg(int a, int b, int c): s1(a),s2(b),s3(с) { }

operator int ();

};

treyg :: operator int()

{return (s1+s2+s3); } void main()

{int w,e,r;

printf("Введи три числа\n"); scanf("%d,%d,%d",&w,&e,&r); treyg ABC(w,e,r); printf("perimetr=%d",(int)ABC);

}

Тема 39. Перегрузка операций.

Язык С++ позволяет переопределять для классов существующие обозначения операций. Это называется перегрузкой операций. В результате такой перегрузки для классов можно будет употреблять операции, привычные для базовых типов. Обычно программисты стараются перегружать операции таким образом, чтобы смысл знаков операций сохранялся. Очень многие классы, входящие в комплект

Программирование на языке высокого уровня 09.03.01

44

поставки С++ используют перегруженные операции. В частности, так сделано в классе потоков iostream.h:

cout<<"Долой двоечников"<<endl; cin>>x;

Функции-операции, реализующие перегрузку операций, имеют

вид

operator операция (операнды);

Если функция является элементом класса, то первый операнд соответствующей операции будет самим объектом, для которого вызвана функция-операция. В случае унарной операции список параметров будет пуст. Для бинарных операций функция будет иметь один параметр, соответствующий второму операнду. Если функцияоперация не является элементом класса, она будет иметь один параметр в случае унарной операции и два в случае бинарной. Тернарная операция ?: не может быть перегружена.

Приоритеты и правила вычисления остаются для перегруженных операций такими же, что и для операций над встроенными типами. Поведение операции по отношению к встроенному типу изменить нельзя. Функция-операция должна быть либо элементом класса, либо иметь один или несколько параметров типа класса. Аргументов по умолчанию функция-операция иметь не может.

class proverka { int a,b;

public:

proverka (int aa, int bb):a(aa),b(bb)

{}

proverka operator + (const proverka &); };

proverka proverka:: operator + (const proverka &zaval) { proverka marazm(0,0);

marazm.a=a+zaval.a;

marazm.b=b+zaval.b; return marazm;

}

void main()

{proverka q(10,10); proverka w(7,7);

proverka summa(0,0); summa=q+w;

}

Очень важно, что если для представителей класса определен оператор +, то это не значит, что можно пользоваться оператором +=. Если есть желание или необходимость пользоваться таким оператором, то его нужно перегружать отдельно.

Программирование на языке высокого уровня 09.03.01

45

Источник: https://studfile.net/preview/16415559/