Rabochy_stol / 12 функции члены класса
.docx12. функции – члены класса
1. Понятие класса
Целью введения концепции классов в C++ является предоставление программисту средств создания новых типов, которые настолько же удобны в использовании, как и встроенные. Кроме того, производные классы и шаблоны представляют способы организации классов, имеющих между собой нечто общее.
Тип является конкретным представлением некоторой концепции. Например, встроенный тип float вместе с операциями +, –, * и т.д. представляет конкретное воплощение математической концепции вещественного числа.
Класс – это определённый пользователем тип. Объявление класса задаёт представление объектов этого класса и набор операций, которые можно применять к таким объектам. Класс обеспечивает абстракцию данных, он скрывает детали представления объекта и предоставляет доступ к содержащимся в нём данным только посредством функций и операций, описанных как часть этого класса.
Основной смысл введения новых типов состоит в разделении малозначащих деталей реализации (например, расположения в памяти составных частей объектов данного типа) от свойств, имеющих определяющее значение для правильного использования сущности (например, полный набор функций доступа к данным). Подобное разделение лучше всего выражается в терминах ограничения доступа к данным извне и использования для этой цели специальных процедур в рамках четко определённого интерфейса.
Тщательно подобранный набор типов, определяемых пользователем, делает программу более краткой и выразительной. Кроме того, такие типы дают возможность проведения разнообразного анализа кода. В частности, они позволяют компилятору обнаружить случаи недопустимого использования объектов, которые иначе не были бы выявлены вплоть до этапа тестирования.
Объявление класса выглядит следующим образом:
class <имя класса> { <список членов класса> };
Объявление класса является объявлением некоторого типа. Для дальнейшей работы необходимо объявлять соответствующие переменные или объекты класса.
class X { ... }; |
// Объявление типа X |
X x; |
// Объявляем переменную х – объект класса (типа) Х |
Объекты класса можно присваивать, передавать в качестве параметров функции и возвращать как её результат. Другие естественные операции, вроде проверки на равенство, также могут быть определены пользователем.
2. Члены класса
В списке членов класса можно объявлять переменные, функции, классы, перечисления, а такжедружественные функции и классы. Член класса не может объявляться в списке членов класса дважды. Это относиться и к функциям (хотя могут быть функции с одним именем, но разным набором формальных параметров). Кроме того, нельзя объявить в классе переменную и функцию с одним именем. Список членов класса определяет полный набор членов этого класса. Нельзя добавлять к классу члены ещё в каком-то месте.
class X |
|
{ int i; |
|
int i; |
// Ошибка – повторное объявление |
}; |
|
int X::k; |
// Ошибка – попытка объявить член класса вне объявления класса |
class Y |
|
{ int f(); |
|
int f(); |
// Ошибка – повторное объявление функции |
int f(int x); |
// Ошибок нет |
}; |
|
class Z |
|
{ int f(); |
|
int f; |
// Ошибка – есть функция с таким же именем |
}; |
|
Член класса не может иметь инициализатора. Член класса не может быть объявлен со спецификациями класса памяти auto, extern и register. Инициализация объектов класса осуществляется с помощью конструкторов. Объект класса не может содержать объект того же класса, но может содержать указатель или ссылку на объект того же класса.
Для доступа к членам класса (после объявления некоторой переменной этого класса или указателя на объект данного класса) используется следующий синтаксис:
<переменная> . <имя члена класса>
<указатель> -> <имя члена класса>
3. Доступ к членам класса
Управление доступом применяется единообразно к функциям-членам класса и данным-членам класса.
Член класса может быть:
приватным (private) – это значит, что его имя может употребляться лишь внутри функций-членов класса идрузей класса, в котором этот член класса объявлен;
защищённым (protected) – это значит, что его имя может употребляться лишь внутри функций-членов класса, друзей этого класса и производных от него классов;
публичным (public) – это значит, что его имя может употребляться внутри любой функции (а также и вне функций в инициализаторах).
Модификаторы доступа можно использовать несколько раз в одном и том же объявлении класса.
Механизмы управления доступом в C++ обеспечивают защиту от случайного, а не от преднамеренногодоступа. Однако это относится к проблемам дисциплины программирования, а не к проблемам языка.
Члены класса без спецификатора доступа по умолчанию являются приватными. Члены структур иобъединений по умолчанию являются публичными.
4. Функции-члены класса
Функция, объявленная в классе без спецификатора friend, называется функцией-членом класса. Её вызов имеет соответствующий синтаксис.
Описание функции-члена класса относиться к области действия класса. Это означает, что функция-член класса может непосредственно использовать имена членов своего класса.
class X { private: int n; public: void f(); };
|
// Объявление класса Х |
void X::f() { n++; }
|
// Определение функции f из класса Х |
X a, b; |
// Объявление переменных класса Х |
a.f(); |
// Вызов функции f применяется к переменной а. Таким образом, // изменяется член n переменной a. Переменная b остаётся без изменений. |
4.1. Константные функции-члены класса
В объявлении функции после списка параметров можно добавить модификатор const. Это будет означать, что функция не меняет состояние объекта, к которому она применяется. Суффикс const является частью типа функции и должен записываться, когда функция определяется вне класса.
class X { private: int n; public: int f() const; };
int X::f() const |
|
{ return n++; } |
// Ошибка – попытка изменить значение члена класса в константной функции |
Константную функцию-член класса можно вызвать как для константного, так и для неконстантного объекта, в то время как неконстантную функцию можно вызвать только для объекта, не являющегося константой.
4.2. Указатель this
В нестатической функции-члене класса ключевое слово this обозначает указатель на объект, для которого вызвана данная функция, т.е. внутри функции-члена класса член того же класса с именем х можно обозначать как x, и как this -> x. Указатель на объект, для которого вызвана функция, является неявным параметром этой функции.
class X { private: int a; public: |
|
void f(int a) { this -> a = a; } }; |
// Члену класса a присваивается значение параметра a |
Указатель this в функции-члене класса Х имеет тип X * const. Однако, это не обычная переменная, невозможно получить её адрес или присвоить ей что-нибудь. В константной функции-члене класса Х this имеет тип const X * const для предотвращения модификации самого объекта.
В большинстве случаев использование this является неявным. В частности, каждое обращение к нестатическому члену класса неявно использует this для доступа к члену соответствующего объекта.
Функции-члены класса могут также возвращать с помощью указателя this ссылку на объект класса для того, чтобы можно было использовать вызов функции как параметр другой функции.
class X { ... public: X& f(); };
X& X::f() { ... return *this; } |
4.3. Встраиваемые функции-члены класса
Функция-член класса может быть описана внутри объявления класса. В этом случае она считаетсявстраиваемой (inline) функцией.
Пример. В обоих случаях функция GetSize является встраиваемой.
class Vector { private: int size; ... public: int GetSize() { return size; } ... }
class Vector { private: int size; ... public: int GetSize(); ... }
inline int Vector::GetSize() { return size; } |