Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

Void increment(int& X)

{x+=1;}

void increment(int*x)

{*x=*x+1;}

main()

{

int v=3;

increment(v);

int anotherv=5;

increment(& anotherv);

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

printf ("anotherv=%d\n",anotherv);}

Результат:

v=4

anotherv=6

Конструкції int& x та int* x – це різні сигнатури. Тому, з урахуванням можливості перевантаження функцій, їх можна записати в одній області видимості. Проте викликатиметься спочатку перша функція (у рядку increment (v);), адже фактичним параметром її має бути посилання. Потім викликається друга, параметром якої є покажчик. Друга функція викличеться й за такої ситуації:

int*v1;

*v1=6;

increment(v1);

Використання посилань як формальних параметрів функцій має деякі особливості. Розглянемо програму:

void changev(int&p)

{p+=20;

printf("значення p у функцiї=%d\n",p);}

main()

{int x=50;

changev(x);

printf("x=%d\n",x);

int y=100;

changev(x+y);

printf("x=%d y=%d\n",x,y);

float r=-1.5;

changev(r);

printf("r=%0.2f\n",r);

}

Результат:

значення p у функцiї=70

x=70

значення p у функцiї=190

x=70 y=100

значення p у функцiї=19

r=-1.50

Результат виклику функції changev з аргументом x у функції main() пояснюється елементарно. При виклику changev(x+y) створюється локальна копія формального параметра, з якою вона працює (параметри передаються за значенням). У випадку виклику changev(r) компілятор не може зв'язати посилання на тип int зі змінною типу float. Тоді створюється тимчасова змінна, яка і зв'язується з р:

float r=-1.5;

int temp=r;

changev(temp);

Після iнiцiалiзації посилання йому не можна присвоїти інші значення:

int ivar=12;

int &iref=ivar; /*Посилання на ivar*/

Int anotherint;

iref=anotherint; //не допускається

Посилання можуть повертатися функцiями: double & ref(int d);

Функції посилання використовуються для закриття внутрішнього зображення структури даних. Наприклад:

#define FALSE 0

# define SIZE 100

#define BUFLEN 100

double & ref(int index);

void showarray(void);

double array[SIZE];

main()

{int done=FALSE,index;

char buffer[BUFLEN];

for(index=0;index<SIZE;index++)

ref(index)=index;

while(!done)

{showarray();

cout<<"\n введiть index вiд 0 до 9\n";

cin.getline(buffer,buflen)

done=(strlen(buffer)==0);

if(!done)

{

index=ataf(buffer); //перетворення рядка на число

cout<<"введiть значення типу float";

cin.getline(buffer,buflen);

/*введення значення в буфер*/

ref(index)=ataf(buffer);

}}

return 0;

}

double & ref (int index)

{if(index<0)index=0;

return array[index];}

void showarray(void)

{cont<<"\n array:\n";

for(int i=0;i<SIZE;i++)

cout<<"["<<i<<"]"<<array[i]<<'\n';

}

7.4.8. Специфікатор INLINE

Специфікатор використовується для того, щоб компілятор розміщував код функції безпосередньо в місце її виклику. При цьому зростає швидкодія програми, але збільшується об'єктний код. Наприклад:

void notinline(void){}

inline void isinline(void){}

main()

{printf("starting notinline\n");

for(long i=1;i<5000000;i++)notinline();

printf("starting isinline\n");

for(i=1;i<5000000;i++)isinline();}

З isinline функцiя виконується у кілька разів швидше.

7.4.9. Операції NEW і DELETE

Операція new служить для виділення пам'яті. Синтаксично допускається три способи її використання:

1) new type_name

Наприклад:

float*r=new float;

За такого оголошення r буде покажчиком на значення типу float, причому вказувати він буде на початок уже виділеної області пам'яті розміром float, на відміну від оголошення float*r;, де пам'ять не виділяється.

2) new(type_name)

Наприклад:

float*r=new(float);

Цей випадок аналогічний попередньому.

3) new type_name[expression]

Наприклад:

float*r=new float[20];

Операція Delete служить для звільнення пам'яті в купі. Відповідно до операції new, синтаксично допускаються такі способи її використання:

1) delete var_name;

Наприклад:

float*r=new float[20];

delete r;

2) delete[expr]var_name

Наприклад:

float*r=new float[20];

delete[20]r;

Зазначимо, що дія в першому та другому випадках аналогічна. Виділивши пам'ять, наприклад

float*r=new float[20];

можемо звільнити її будь-яким з таких способів:

delete[200]r; delete[20]r; delete[10]r; delete[2]r; delete[]r; delete r;