ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4274
Скачиваний: 28
Часть II. Язык программирования С++
136
личных алфавитов при помощи широких символов предназначе-
на спецификация Unicode, которая включает коды символов на-
циональных алфавитов и любых печатных символов.
Широкие символьные константы определяются следующим об-
разом:
L'символ'
Таким же образом определяется любой символ из кодовой табли-
цы ASCII. Например, объявление:
wchar_t w = L'S';
определяет переменную типа
wchar_t
и инициализирует ее широ-
кой символьной константой
S
.
Управляющие символы языка программирования C++ кодируют-
ся обычным образом, например,
L'\n'
,
L'\0'
. Ноль всегда соот-
ветствует пустому широкому символу.
Строка, состоящая из широких символов, называется
широкой
(wide) строкой. Широкий строковый литерал определяется сле-
дующим образом:
L"строка_символов"
Например, объявление:
wchar_t ws[] = L"This is a string.";
определяет массив типа
wchar_t
и инициализирует его широкой
строкой.
В листинге 10.1 приведен пример объявления и вывода на кон-
соль широких символов и строк. В этом листинге
wcout
— это
стандартный поток вывода широких символов на консоль. Для
вывода в этот поток данных разнообразных типов используется
оператор
<<
, а манипулятор
endl
предназначен для перехода на
начало следующей строки. Подробно работа с потоками вво-
да/вывода языка программирования С++ рассмотрена в
гл. 40
.
Листинг 10.1. Объявление широких символов и строк
#include <iostream>
using namespace std;
Глава 10. Дополнения к типам данных языка С
137
int main()
{
wchar_t w = L'S';
wchar_t ws[] = L"This is a string.";
wcout << w << endl; // S
wcout << ws << endl; // This is a string.
return 0;
}
10.3. Анонимные объединения
В языке программирования С++ допускается объявление
аноним-
ных объединений
. Анонимные объединения являются не типами,
а объектами. Доступ к членам анонимного объединения осущест-
вляется по их именам, которые должны быть уникальными внут-
ри области видимости, в которой объявлено это объ-
единение.
В листинге 10.2 приведен пример доступа к членам анонимного
объединения. В этом листинге
cout
— это стандартный поток вы-
вода на консоль, который работает с символами в коде ASCII.
Для вывода в этот поток данных разнообразных типов использу-
ется оператор
<<
, а манипулятор
endl
предназначен для перехода
на начало следующей строки. Подробно работа с потоками вво-
да/вывода языка программирования С++ рассмотрена в
гл. 40
.
Листинг 10.2. Доступ к членам локального анонимного
объединения
#include <iostream>
using namespace std;
int main()
{
union {
int n;
double d;
};
Часть II. Язык программирования С++
138
n = 10;
cout << n << endl; // печатает 10
d = 10.5;
cout << d << endl; // печатает 10.5
return 0;
}
Глобальные анонимные определения должны определяться как
статические. В листинге 10.3 показан пример объявления гло-
бального анонимного объединения и доступа к его членам.
Листинг 10.3. Доступ к членам глобального анонимного
объединения
#include <iostream>
using namespace std;
static union
{
int n;
double d;
};
int main()
{
n = 10;
cout << n << endl; // печатает 10
d = 10.5;
cout << d << endl; // печатает 10.5
return 0;
}
10.4. Ссылки
Ссылкой
называется указатель на переменную или константу, ко-
торый всегда
разыменовывается
при его использовании. Поэто-
му ссылка всегда содержит значение переменной или константы,
на которую она ссылается. Для объявления переменной типа
"ссылка" используется символ
&
, который записывается перед
именем переменной. Если ссылка используется как самостоя-
Глава 10. Дополнения к типам данных языка С
139
тельный объект, то она должна быть инициализирована констан-
той или переменной при своем определении. В первом случае
ссылка называется
константной ссылкой
. Во втором случае —
псевдонимом переменной
. После инициализации ссылка не может
быть изменена. Со ссылкой на объект можно производить такие
же действия, что и с объектом, на который она ссылается.
В листинге 10.4 приведен пример объявления и инициализации
ссылки.
Листинг 10.4. Объявление и инициализация ссылки
#include <iostream>
using namespace std;
int main()
{
const int n = 10;
const int &rn = n; // ссылка на константу n
int m = 2;
int &rm = m; // ссылка на переменную m
rm = 20; // изменяем значение переменной m через ссылку
cout << rn << endl; // печатает 10
cout << m << endl; // печатает 20
return 0;
}
Ссылки в язык программирования C++ введены для двух целей:
чтобы обеспечить возможность передачи аргументов в функ-
ции без их копирования в параметры функции;
чтобы обеспечить возможность возврата из функции L-value.
Отметим, что оператор
sizeof
от ссылки дает размер объекта, на
который ссылается ссылка. Например:
short n;
short& r = n;
size_t s;
s = sizeof(r); // s = 2
Часть II. Язык программирования С++
140
10.5. Новые операторы
явного преобразования типов
В язык программирования C++ для явного преобразования типов
данных введены операторы:
const_cast
,
static_cast
,
dynamic_cast
и
reinterpret_cast
, которые имеют следующий синтаксис:
оператор<тип>(выражение)
Здесь
оператор
— это один из операторов преобразования типа, а
тип
— является типом данных, к которому приводится
выражение
.
Если
тип
является ссылкой, то
оператор
вернет L-value, в против-
ном случае
оператор
вернет R-value. Все новые операторы преоб-
разования типа имеют ассоциативность справа налево, а их при-
оритет совпадает с приоритетом постфиксных операций инкре-
мента и декремента. Далее новые операторы преобразования
типов будут рассмотрены подробнее.
Оператор
static_cast
Оператор
static_cast
выполняет преобразования типов, которые
не могут быть сделаны компилятором неявно. Этот оператор не
отменяет квалификаторы
const
или
volatile
. Работает оператор
static_cast
на этапе компиляции программы.
В листинге 10.5 приведен пример использования оператора
static_cast
.
Листинг 10.5. Использование оператора
static_cast
#include <iostream>
using namespace std;
int main()
{
double d = 97.0;
char c = static_cast<char>(d);
cout << c << endl; // печатает символ 'a'
return 0;
}