
- •Конструкторы и деструкторы
- •Файл Dot.h
- •Файл Dot.cpp
- •Файл Main.cpp
- •Правила для конструкторов
- •Правила для деструкторов
- •Список инициализации элементов
- •Конструкторы по умолчанию
- •Конструкторы копирования
- •Указатель this
- •Встраиваемые (inline) функции
- •Файл Dot.h
- •Статические данные-члены класса
- •Файл Dot.h
- •Файл Dot.cpp
- •Файл Main.cpp
- •Статические функции-члены класса
- •Константные данные-члены класса
- •Константные функции-члены класса
- •Константные объекты
Лекция 3 |
Функции-члены класса |
5 |
нов-данных, такое копирование нас не устраивает, поскольку мы хотим, чтобы каждая точка имела уникальное имя и не изменяла его в ходе выполнения программы.
В приведённом примере точки C и D объявлены с помощью конструктора копирования объявленного нами. В этом конструкторе имя точки инициализируется фиксированным значением – русской буквой “т”.
Для решения этой задачи в приведённом примере объявлен конструктор:
Dot ( char Name , const Dot& A ) |
{ name = Name ; x = A.x ; y = A.y ; } , |
Этот конструктор в качестве параметров принимает имя и точку, координаты которой используются для инициализации объявляемой точки.
Указатель this
Каждый объект в C++ содержит специальный указатель с именем this, который автоматически создается самим компилятором и указывает на текущий объект. Типом this является Т*, где Т – тип класса текущего объекта. Поскольку указатель this определен в классе, область его действия – класс, в котором он определен. Фактически this является скрытым параметром класса, добавляемым самим компилятором к его определению. При вызове обычной функции-члена класса ей передается указатель this так, как если бы он был первым аргументом. Таким образом, вызов функции-члена
ObjName.FuncName ( parl , par2 ) ;
компилятор трактует так:
ObjName.FuncName ( &ObjName , parl , par2 ) ;
Но, поскольку аргументы помещаются в стек справа налево, указатель this помещается в него последним. В теле функции-члена адрес объекта доступен как указатель this. Дружественным функциям и статическим функциям-членам класса указатель this не передается. Нижеследующий пример демонстрирует использование этого указателя:
// функция возвращает точку - середину отрезка, концы которого заданы
Dot& Dot :: Middle ( Dot A , Dot B )
{
x = ( A.x + B.x ) / 2.0 ; |
y = ( A.y + B.y ) / 2.0 ; // вычисляет середину отрезка |
Print ( ) ; |
// выводит на экран координаты текущей точки |
this -> Print ( ) ; |
// все три оператора эквивалентны |
(*this) . Print ( ) ; |
|
return *this ; |
// возвращает ссылку на текущую точку |
}
Как можно видеть, внутри функции-члена Middle ( Dot A , Dot B ) обращения к данным-членам класса и функциям-членам могут осуществляться как непосредственно по имени, так и с помощью указателя this. На практике такое употребление указателя this встречается крайне редко. В основном указатель this используется для возврата указателя ( в форме: return this ;) или ссылки ( в форме: return *this ;) на соответствующий объект. Этот указатель находит широкое применение при перегрузке операторов.
Встраиваемые (inline) функции
В C++ можно задать функцию, которая, фактически, не вызывается, а ее тело встраивается в программу в месте ее вызова. Она действует почти так же, как макроопределение с параметрами. По сравнению с обычными функциями встраиваемые ( inline ) функции обладают тем преимуществом, что их вызов не связан с передачей аргументов и возвратом результатов через стек и, следовательно, они выполняются быстрее обычных. Недостатком встраиваемых функций является то, что если они слишком большие и вызываются слишком часто, объем программы сильно возрастает. Из-за этого применение встраиваемых функций обычно ограничивается только очень простыми функциями.
Объявление встраиваемой функции осуществляется с помощью спецификатора inline, который вписывается перед определением функции.
Следует иметь в виду, что спецификатор inline только формулирует требование компилятору сформировать встроенную функцию. Если компилятор не в состоянии выполнить это требование, функция компилируется как обычная. Компилятор не может сгенерировать функцию как встраиваемую, если она:
содержит оператор цикла ( for, while, do-while ); содержит оператор switch или go to;
содержит статическую переменную (static); если функция является рекурсивной;
имеет возвращаемый тип, отличный от void, и не содержит оператора return; содержит встроенный код ассемблера.
Выжол Ю.А. |
Объектно-ориентированное программирование |