Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4274

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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; 


background image

Глава 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; 
  }; 


background image

Часть 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. Ссылки 

Ссылкой

 называется указатель на переменную или константу, ко-

торый  всегда 

разыменовывается

  при  его  использовании.  Поэто-

му ссылка всегда содержит значение переменной или константы, 

на  которую  она  ссылается.  Для  объявления  переменной  типа 
"ссылка"  используется  символ 

&

,  который  записывается  перед 

именем  переменной.  Если  ссылка  используется  как  самостоя-


background image

Глава 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 


background image

Часть 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; 


Смотрите также файлы