printУлучшения языка C

printОбъявления. Вывод типа. Ссылки

Появился тип bool и резервированные слова true и false. Любое ненулевое значение преобразуется в true, а нулевое – в false.

Объекты можно объявлять в любой точке программы, в том числе в инициализирующей части цикла for и в условии if и while. Можно инициализировать объекты любым выражением, не только константным, в том числе и статические объекты.

Вместо конкретного типа в объявлении можно указать auto, тогда компилятор сам определит тип по типу инициализирующего выражения.
auto a=1; // int a
auto b=1.5; // double b;
auto x=a+b; // тип x определяется типом выражения a+b (double)
decltype(x) y; // тип y совпадает с типом объекта x
В C++ допускается указывать auto для типа возвращаемого значения[/url] функции, если определение функции дано перед её вызовом в компилируемом модуле, тогда тип определяется по результату, возвращаемому return.

Если функция возвращает набор из несколько значений, то можно использовать декомпозицию при объявлении для разбиения возвращаемого значения функции на отдельные элементы. Это работает для структур языка C, а также некоторых классов C++ (pair, tuple, array):
struct Point { double x,y,z; };
Point add(Point p1, Point p2) 
{ return {p1.x+p2.x,p1.y+p2.y,p1.z+p2.z}; 
}
auto [x3,y3,z3]=add({1,2.5,3},{7,1,6});
pair<int,double> fun();
auto [a,b]=fun();


В языке С реализована только передача параметров по значению. Если потребуется изменение переменной внутри функции, то нужно передать функции адрес переменной, применив операцию &, а внутри функции выполнять операцию разыменования для параметра при всех обращениях к этой переменной. В С++ появилась замена для указателей – ссылка, которую можно рассматривать как константный указатель, который всегда разыменован.

Ссылка должна инициализироваться при создании некоторым объектом, адрес которого будет храниться в ссылке. Перенаправить ссылку на другой объект нельзя. Изменение ссылки приводит к изменению объекта.
int a=5;
int &b=a;
b=6; // a=6
Чаще всего ссылки используются в качестве параметров функций.
void swap(int &x, int &y)
{ int t;
  t=x;
  x=y;
  y=t;
}
int main()
{ int a=1, b=2;
  swap(a,b);
  // a=2, b=1
}
Функция может возвращать ссылку. Результат такой функции можно использовать в качестве левого операнда присваивания. Можно возвращать только ссылку на аргумент функции (или его часть), переданный по ссылке, или на статический объект.
// Ассоциативный массив
struct item { int key; double val; }  data[100];
int ndata;
double &getdata(int key)
{ for(int i=0;i<ndata;++i)
    if(data[i].key==key) // есть элемент с таким ключом
      return data[i].val;
  data[ndata].key=key; // добавить новый элемент
  return data[ndata++].val;
}
...
getdata(-5)=0.5;
getdata(4)=getdata(-5)+7; // 7.5

В С++11 была добавлена ссылка &&, которая используется для ссылок на временные значения, получающиеся в результате вычислений и уничтожаемые после выполнения оператора. Разницу между этими видами ссылок можно использовать для оптимизации вычислений (см. перемещающие конструкторы).
loading