Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Объявление и определение методов
Объявление методов внутри класса осуществляется также как и объявление обычной функции. Определение метода обычно размещают вне класса, указывая название класса перед названием метода. Между двумя названиями вставляется оператор ::
. При обращении к методам класса используется следующий формат:
<Экземпляр класса>.<Имя метода>([<Параметры>])
Определение метода можно разместить внутри объявления класса. В этом случае содержимое метода вставляется в место вызова метода. Такие методы называются встраиваемыми. Встраиваемыми имеет смысл делать все небольшие методы. Пример объявления и определения методов приведен в листинге 13.2.
Листинг 13.2. Объявление и определение методов
#include <iostream>
class C {
int x_; // Закрытое поле
public:
void setX(int x) {x_ = x;} // Определение встраиваемого метода
int getX(); // Объявление обычного метода
};
int main() {
C obj;
// Изменение значения закрытого поля
obj.setX(10);
// Получение значения
std::cout << obj.getX() << std::endl; // 10
return 0;
}
int C::getX() { // Определение обычного метода
return x_;
}
В этом примере поле x_
является закрытым. Получить доступ к такому полю можно только внутри методов класса. Обратиться к полю напрямую через экземпляр класса нельзя. Чтобы обозначить, что поле закрытое, последним символом названия является символ подчеркивания. Некоторые программисты в этом случае указывают символ подчеркивания в самом начале названия поля. Для изменения и получения значения поля предназначены методы setX()
и getX()
соответственно. Внутри метода setX()
можно контролировать значение, присваиваемое закрытому полю. Таким образом соблюдается принцип сокрытия данных, называемый инкапсуляцией.
Метод setX()
определен внутри класса. В этом случае метод является встраиваемым и его содержимое вставляется в место вызова. Объявление метода getX()
находится внутри объявления класса, а определение — вне объявления класса. В этом случае метод будет вызываться, а не встраиваться. Перед названием метода в определении указывается название класса и оператор ::
(C::getX()
). Методы setX()
и getX()
содержат только одну инструкцию, поэтому на практике оба метода имеет смысл сделать встраиваемыми.
Как видно из примера, внутри методов обращение к полям (даже к закрытым) происходит как к обычным локальным переменным. Обратиться к полям явным образом можно через указатель this
, который неявно передается в каждый метод. Доступ к полю через указатель this
осуществляется с помощью оператора ->
. Пример:
void setX(int x) { this->x_ = x; }
Определение метода можно записать по-другому:
void setX(int x) { (*this).x_ = x; }
В этом случае вместо оператора ->
используется точечная нотация. Круглые скобки являются обязательными, так как приоритет оператора точка
выше, чем приоритет оператора разыменования *
. Если скобки убрать, то вначале будет сделана попытка выполнить оператор точка
, что приведет к ошибке.
Некоторые методы могут получать в качестве параметра объекты другого класса. Если используются только два класса, то объявление одного класса достаточно вставить перед объявлением другого класса. Однако при увеличении количества классов возникает ситуация, в результате которой приходится решать вопрос: что было раньше курица или яйцо? Чтобы избежать такой ситуации в языке C++ предусмотрено неполное объявление класса, имеющее следующий формат:
class <Название класса>;
Пример использования неполного объявления класса приведен в листинге 13.3.
Листинг 13.3. Неполное объявление класса
#include <iostream>
class A; // Неполное объявление. Если убрать, то будет ошибка
class B {
public:
int func(A &obj); // Объявление метода
};
class A {
public:
int x;
A(int a) { x = a; } // Конструктор
};
int main() {
A a(20);
B b;
std::cout << b.func(a) << std::endl; // 20
return 0;
}
int B::func(A &obj) { // Определение метода
return obj.x;
}
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов