//
//
double price = 109.99, discount = price * 0.16;
//
//
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; //
Компилятор откажет в инициализации переменных а
и b
, поскольку использование значения типа long double
для инициализации переменной типа int
может привести к потере данных. Как минимум, дробная часть значения переменной ld
будет усечена. Кроме того, целочисленная часть значения переменной ld
может быть слишком большой, чтобы поместиться в переменную типа int
.
То, что здесь представлено, может показаться тривиальным, в конце концов, вряд ли кто инициализирует переменную типа int
значением типа long double
непосредственно. Однако, как представлено в главе 16, такая инициализация может произойти непреднамеренно. Более подробная информация об этих формах инициализации приведена в разделах 3.2.1 и 3.3.1.
При определении переменной без инициализатора происходит ее
Значение объекта встроенного типа, не инициализированного явно, зависит от того, где именно он определяется. Переменные, определенные вне тела функции, инициализируются значением 0. За одним рассматриваемым вскоре исключением, определенные в функции переменные встроенного типа остаются
Инициализацию объекта типа класса контролирует сам класс. В частности, класс позволяет определить, могут ли быть созданы его объекты без инициализатора. Если это возможно, класс определяет значение, которое будет иметь его объект в таком случае.
Большинство классов позволяет определять объекты без явных инициализаторов. Такие классы самостоятельно предоставляют соответствующее значение по умолчанию. Например, новый объект библиотечного класса string
без инициализатора является пустой строкой.