Новые средства языка С++. Ссылки


Ссылка — это псевдоним для другой переменной. Они объявляются при помощи символа &. Ссылки должны быть проинициализированы при объявлении, причем только один раз.

Тип "ссылка на type" определяется следующим образом:

type& имя_перем.

int& i, double& var.

Инициализация ссылки производится следующим образом:

int i = 0;

int& iref = i;

Физически iref представляет собой постоянный указатель на int — переменную типа int* const. Ее значение не может быть изменено после ее инициализации. Ссылка отличается от указателя тем, что используется не как указатель, а как переменная, адресом которой она была инициализированна:

iref++; //тоже самое, что i++

int *ip = &iref; //тоже самое, что ip = &i;

Таким образом, iref становится синонимом переменной i.

При передаче больших объектов в функции с помощью ссылки его не копируют в стек и следовательно, повышают производительность.

//Программа 1.

#include <iostream.h>

void incr (int&);

void main(void)

{

int i = 5;

incr(i);

cout<< "i= " << i << "\n";

}

void incr (int& k)

{

k++;

}

Поскольку ссылка это псевдоним, то при передаче объекта в функцию по ссылке внутри нее объект можно изменять. Для указания компилятору что ссылка используется только в целях повышения эффективности используется модификатор const.

Ссылки не могут ссылаться на другие ссылки или на поле битов.

Не может быть массивов ссылок или указателей на ссылку.

Ссылка может использоваться для возврата результата из функции. Возвратить результат по ссылке — значит возвратить не указатель на объект и не его значение, а сам этот объект.

//Программа 2.

#include <iostream.h>

int& func (int&);

void main (void)

{

int i = 5;

int& y = func(i+1);

cout << "i = " << i << "\n";

cout << "y = " << y << "\n";

}

int& func (int& k)

{

return k;

}

1.2. Спецификатор const.

Существуют 3 вида именнованных констант:

— имя любого массива или функции;

— имена членов перечисления;

— любое имя любого типа, в определении которого присутствует модификатор const.

const i = 5;

const char *ip = &c;

Поскольку модификация такого объекта-константы запрещена, он должен быть инициализирован.

const int *ip; //константой является объект на который указывает указатель;

int* const ip; //сам указатель является константой

const char *pc = "Это строка";

pc[2] = ‘a’; //ошибка

pc = "Это другая строка"; //верно

char* const pc = "Это строка";

pc[2] = ‘a’; //верно

pc = "Это другая строка"; //ошибка

Использование const предпочтительнее по сравнению с #define, так как использование константы контролирует компилятор.

1.3. Спецификатор enum.

Спецификатор enum позволяет программисту создавать собственные типы.

enum weekDays { Monday, Tuesday, Wensday, Thursday, Friday };

weekDays days;

Переменная days теперь может принимать одно из 5 значений.

days = Wensday;

Идентификаторы перечисления представляют собой целочисленные переменные, которые по умолчанию имеют значения 0,1,…, если не указаны другие значения.

enum colors { Red=2, Green=3};