В общем виде вызов любого метода для конкретного объекта выглядит так:
объект.метод(параметры)
Если метод возвращает значение некоторого типа, то такое выражение можно использовать в других выражениях, вычисляющих значения. Если значение не возвращается (как в методе i ni t ()), то выражение записывается как отдельный оператор вызова:
объект.метод(параметры);
Мы можем определить метод и вне класса. Но тогда надо явно указать, что определяемый метод принадлежит именно классу TMoney. А в классе остается только прототип (листинг 1.9).
Листинг 1.9. Внешнее определение метода lnit() class TMoney
{ long double Summa; // денежная сумма
public:
void Init(const long double &t); // объявляем прототип
};
void TMoney::Init(const long double &t=0.0)
{ // переводим в копейки и отсекаем оставшийся "хвостик"
long double г = floor(((t<0)? -t: t)*100);
Summa = (t<0)? -г: г; // учитываем знак
}
Как видим, явное указание принадлежности классу задается префиксом — именем класса в заголовке определения метода. Тем не менее внутри метода имена полей (и других методов класса) задаются без всяких префиксов. Различие внешнего и внутреннего определений заключается только в том, что метод, определенный внутри класса, считается по умолчанию подставляемой (inline) функцией (см. п. 7.1.2/3 в [1]). Однако на деле компилятор отнюдь не всегда транслирует внутренний метод как подставляемый — это зависит целиком и полностью от реализации компилятора. В качестве подставляемых лучше определять небольшие методы, выполняющие простую работу и не содержащие циклов или рекурсивных вызовов. В остальном внешнее определение ничем не отличается от внутреннего. Вызов тоже точно такой же. |