Объявление и определение методов

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

<Экземпляр класса>.<Имя метода>([<Параметры>])

Определение метода можно разместить внутри объявления класса. В этом случае содержимое метода вставляется в место вызова метода. Такие методы называются встраиваемыми. Встраиваемыми имеет смысл делать все небольшие методы. Пример объявления и определения методов приведен в листинге 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;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов