Программирование >>  Расширенная версия языка c++ 

1 ... 20 21 22 [ 23 ] 24 25 26 ... 227


Глава 2.. Введение в классы 75

return а < b ? а: Ь; . . ..

double

inline double rain (double a, double b)

return a < b ? a: b;

int mainO

cout inin(-10, 10) \n ;

cout min(-10.01, 100.002) \n ;

cout min(-10L, 12L)

return 0;

Упражнения

1. В главе 1 вы перегружали функцию abs(iK, чтобы она находила абсолютные значения типа int, long и double. Модифицируйте программу, чтобы эти функции стали встраиваемыми.

2. Почему следующая кция может не компилироваться как встраиваемая?

void fi()

int i;

ford = 0; i < 10; cou< i; . . =

2.7. Встраиваемые функции

в объявлении класса . г, i

Если определение функции-члена достаточно короткое, его можно включить в объявление класса. Поступив таким образом, мы заставляем, если это возможно, функцию стать встраиваемой. Если функция задается внутри объявления класса, ключевое слово inline не требуется. (Однако использование его в такой ситуации не является ошибкой.) Например, как показано ниже, функция divJsiWe() из предьщущего раздела может быть по умолчанию сделана встраиваемой:



76 Самоучитель С++

tinclude <iostreain>

using namespace std;

class samp { int i, j;

public: : -

samp (int a, int b) ;

/* Функции ble (), которая здес даляется, по умолчанию становится встраиваемой.

int divisible О { return !(i%j); }

samp: : samp (int a, int b) ,

i = a;

j = b;

int main ()

samp obi (10, 2), ob2(10, 3); это истина

if {obl.divisibleO ) cout 10 делится на 2\n ; это ложь

sible о ) cou 10 делится на 3\n ;

return 0;

Как видите, код функции ible() находится внутри объявления класса samp. Отметьте, что никакого другого определения функции divisible() не нужно, это даже запрещено. Определение функции divisible() внутри класса samp автоматически заставляет ее стать встраиваемой функцией.

Если функция, заданная внутри объявления класса, не может стать встраиваемой функцией (поскольку были нарушены ограничения), она, обычно, преобразуется в обычную функцию.

Отметьте, как именно функции ibleO задается внутри класса samp, особенно само тело функции. Оно целиком расположено на одной строке. Такой формат для программ C++ является совершенно обгчным, если функция объявляется внутри объявления класса. Такое объявление становится более компактным. Однако класс samp мог бы быть описан и так:

class samp { , . .

int i, j; Ч .. . .



Глава 2. Введением классы 77

public:

a, int

/* Функции Ые () , которая здесь определяется, по умолчанию становится встраиваемой.

V . ... - - ....., . ....... : . ;

int divisible О , ...

return !(i%j); :

У. } ..J- .. . .; I

- : . - [

Здесь в определении функции ible() используется более или менее стандартный стиль отступов. С точки зрения компилятора, компактный и стандартный стили не отличаются. Однако в программах C++ при задании коротких функций внутри определения класса обычно используется ком-пактнхй стиль.

На применение таких встраиваемых функций накладываются те же ограни-что и на применение обычных встраиваемых функций.

Примеры

1. Вероятно наиболее традиционным использованием встраиваемхх функций, определяемых внутри класса, является определение конструктора и деструктора. Например, класс samp может быть определен более эффективно:

ttinclude <iostrQam> - > .. Itl

using namespace std; . t

class samp {

int i, j; , J.. ; \

public: r -u - II . .

встраиваемый конструктор , .-v.-: -i ; j - .u:.

samp {int a, int b) { i = a; j = b; } -Ч- -* ; n--r

int divisible (} { return !(i%j); ; - . Г- -т- <\-

){

Определения функции внутри класса достаточно, и никакого

другого определения не требуется.

2. Иногда короткие функции могут включаться в объявление класса даже тогда, когда преимущества встраивания мало что дают или вовсе не проявляются. Рассмотрим следующее объявление класса:

class myclass { - - . .!,.

int i;



1 ... 20 21 22 [ 23 ] 24 25 26 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика