>// ok: переменная price определяется и инициализируется прежде,
>// чем она будет использована для инициализации переменной discount
>double price = 109.99, discount = price * 0.16;
>// ok: Вызов функции applyDiscount() и использование ее возвращаемого
>// значения для инициализации переменной salePrice
>salePrice = applyDiscount(price, discount);
Инициализация в С++ — на удивление сложная тема, и мы еще не раз вернемся к ней. Многих программистов вводит в заблуждение использование символа >=
при инициализации переменной. Они полагают, что инициализация — это такая форма присвоения, но в С++ инициализация и присвоение — совершенно разные операции. Эта концепция особенно важна, поскольку во многих языках это различие несущественно и может быть проигнорировано. Тем не менее даже в языке С++ это различие зачастую не имеет значения. Однако данная концепция крайне важна, и мы будем повторять это еще не раз.
Тема инициализации настолько сложна потому, что язык поддерживает ее в нескольких разных формах. Например, для определения переменной >units_sold
типа >int
и ее инициализации значением >0
можно использовать любой из следующих четырех способов:
>int units_sold = 0;
>int units_sold = {0};
>int units_sold{0};
>int units_sold(0);
При использовании с переменными встроенного типа эта форма инициализации обладает важным преимуществом: компилятор не позволит инициализировать переменные встроенного типа, если инициализатор может привести к потере информации:
>long double ld = 3.1415926536;
>int a{ld}, b = {ld}; // ошибка: преобразование с потерей
>int с(ld), d = ld; // ok: но значение будет усечено
Компилятор откажет в инициализации переменных >а
и >b
, поскольку использование значения типа >long double
для инициализации переменной типа >int
может привести к потере данных. Как минимум, дробная часть значения переменной >ld
будет усечена. Кроме того, целочисленная часть значения переменной >ld
может быть слишком большой, чтобы поместиться в переменную типа >int
.
То, что здесь представлено, может показаться тривиальным, в конце концов, вряд ли кто инициализирует переменную типа >int
значением типа >long double
непосредственно. Однако, как представлено в главе 16, такая инициализация может произойти непреднамеренно. Более подробная информация об этих формах инициализации приведена в разделах 3.2.1 и 3.3.1.
При определении переменной без инициализатора происходит ее инициализация по умолчанию