Явную инициализацию можно применять и при определении переменных списком:
double salary = 9999.99, wage = salary + 0.01;
int month = 08;
day = 07, year = 1955;
Переменная становится видимой (и допустимой в программе) сразу после ее определения, поэтому мы могли проинициализировать переменную wage суммой только что определенной переменной salary с некоторой константой. Таким образом, определение:
// корректно, но бессмысленно
int bizarre = bizarre;
является синтаксически допустимым, хотя и бессмысленным.
Встроенные типы данных имеют специальный синтаксис для задания нулевого значения:
// ival получает значение 0, а dval - 0.0
int ival = int();
double dval = double();
В следующем определении:
// int() применяется к каждому из 10 элементов
vector< int > ivec( 10 );
к каждому из десяти элементов вектора применяется инициализация с помощью int(). (Мы уже говорили о классе vector в разделе 2.8. Более подробно об этом см. в разделе 3.10 и главе 6.)
Переменная может быть инициализирована выражением любой сложности, включая вызовы функций. Например:
#include <cmath>
#include <string>
double price = 109.99, discount = 0.16;
double sale_price( price * discount );
string pet( "wrinkles" );
extern int get_value();
int val = get_value();
unsigned abs_val = abs( val );
abs() – стандартная функция, возвращающая абсолютное значение параметра. get_value() – некоторая пользовательская функция, возвращающая целое значение.
Упражнение 3.3
Какие из приведенных ниже определений переменных содержат синтаксические ошибки?
(a) int car = 1024, auto = 2048;
(b) int ival = ival;
(c) int ival( int() );
(d) double salary = wage = 9999.99;
(e) cin >> int input_value;
Упражнение 3.4
Объясните разницу между l-значением и r-значением. Приведите примеры.
Упражнение 3.5
Найдите отличия в использовании переменных name и student в первой и второй строчках каждого примера:
(a) extern string name;
string name( "exercise 3.5a" );
(b) extern vector<string> students;
vector<string> students;
Упражнение 3.6
Какие имена объектов недопустимы в С++? Измените их так, чтобы они стали синтаксически правильными:
(a) int double = 3.14159; (b) vector< int > _;
(c) string namespase; (d) string catch-22;
(e) char 1_or_2 = '1'; (f) float Float = 3.14f;
Упражнение 3.7
В чем разница между следующими глобальными и локальными определениями переменных?
string global_class;
int global_int;
int main() {
int local_int;
string local_class;
// ...
}