Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 3

void f1(float y);

void f2(int x);

void f2(int &a);

Пример перегрузки для функций, используемых для вычисления объемов сферы (V=4/3πR3), параллелепипеда (V=xyz) и цилиндра (V=πR2h).

#include <stdio.h>

#include <math.h>

float v(float R);

float v(float x, float y, float z);

float v(float R, float H);

void main()

{

float v_sf,v_cil,v_par;

v_sf=v(2.5); //вычисление объема сферы для R=2.5

v_cil=v(3,4.5); // вычисление объема цилиндра для R=3, Н=4.5

v_par=v(2,4,Ø.7); //вычисление объема параллелепипеда

printf("Объем сферы v_sf=%f\n

Объем цилиндра v_cil=%f\n

Объем параллелепипеда v_par=%f\n", v_sf,v_cil,v_par);

}

float v(float R)

{

return 4*M_PI*pow(R,3)/3;

}

float v(float R, float H)

{

return M_PI*R*R*H;

}

float

v(float x,float y,float z)

{

returnx*y*z;

}

17.1 Имена-этикетки

В С++ struct, union, enum являются именами типа переменных точно так, как int, long, float, doubleи т.д. Поэтому, в отличие от языка С при определении переменных нет необходимости употреблять эти ключевые слова.

Пример 1.

struct man

{

...

...

};

man x,y; //Не нужно писать struct man

Пример2.

enum girl {Kate, Ann, Elen};

struct fellow

{

char*name;

girl assistant;

};

fellow x={"Tolik", Ann};

fellow y,z;

Перед girl не нужно писать enum, а перед fellow - слова struct.

17.2 Операция разрешения видимости

Обозначается двумя двоеточиями :: . Используется для обращения к глобальной переменной, имеющей такое же имя, как и у локальной.

Если перед идентификатором переменной стоят два двоеточия, значит используется глобальная переменная.

Пример

#include <stdio.h>

doublex=1Ø; //глобальная переменная

voidmain( )

{

doublex=1ØØ; //локальная переменная

printf("Глобальная переменная х=%f\n",::x);

printf ("Локальная переменная x=%f\n",x);

for(int i=Ø;i<2;i++)

{

doublex=1ØØØ; //Переменная,

существующая только в этом блоке

printf("Внутри блока x=%f\n",x);

}

}

Операция разрешения видимости используется также для обращения к элементам классов, о чем будет сказано позже.

17.3 Встроенные (inline) функции

inline - модификатор определения функции. Предписывает компилятору помещать расширение тела функции везде, где происходит обращение к ней, вместо того, чтобы генерировать код вызова. В inline - функциях недопустимы операторы while, do while, for, switch, goto , а также ассемблерные вставки.

ВНИМАНИЕ! inline - функция должна быть определена до первого ее вызова. Даже если перед прототипом поставить ключевое слово inline, но определить эту функцию после ее вызова, то компилятор генерирует вызов (!) функции вместо создания inline -расширения.

Если inline - функция не является методом класса (об этом позже), то слово inline пишут при определении функции, а не перед прототипом.

Пример.

#include <stdio.h>

inline float min(float a,float b)

{

return a>b? a:b;

}

void main ( )

{

float x,y,v;

puts("введите x,y");

scanf("%f%f",&x,&y);

v=min( x, y);

printf("v=%f\n",v);

}

Наместе вызова функции min( ) будет код тела этой функции.

Встроенные функции позволяют увеличить быстродействие программы. Однако применение больших inline - функций может привести к увеличению объема кода программы.

17.4 Гибкие операторы динамического распределения памяти:new ,delete