Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Программирование » Справочное руководство по C++ - Бьярн Страустрап

Справочное руководство по C++ - Бьярн Страустрап

Читать онлайн Справочное руководство по C++ - Бьярн Страустрап

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 2 3 4 5 6 7 8 9 10 ... 41
Перейти на страницу:

R.4.7 Преобразования ссылок

Всюду, где ссылки (§R.8.2.2) инициализируются (включая передачу параметров (§R.5.2.2) и возврат значения функции (§R.6.6.3)) или используются иным образом, возможны следующие преобразования:

Ссылка на данный класс может быть преобразована в ссылку на доступный базовый класс (§R.10, §R.11.1) данного класса (§R.8.4.3), при условии, что такое преобразование не содержит двусмысленности (§R.10.1.1). Результатом преобразования будет ссылка на объект базового класса, вложенный в объект производного класса.

R.4.8 Указатели на члены

Всюду, где указатели на члены (§R.8.2.3) инициализируются, присваиваются, сравниваются или используются иным образом, могут происходить следующие преобразования:

Константное выражение (§R.5.19), которое сводится к нулю, преобразуется в указатель на член. Гарантируется, что его значение будет отлично от любых других указателей на члены.

Указатель на член данного класса можно преобразовать в указатель на член производного от данного класса, при условии, что допустимо обратное преобразование от указателя на член производного класса в указатель член базового класса, и что оно выполнимо однозначным образом (§R.10.1.1).

Правило преобразования указателей на члены (т.е. от указателя на член базового класса к указателю на член производного класса) выглядит перевернутым, если сравнивать его с правилом для указателей на объекты (т.е. от указателя на производный объект к указателю на базовый объект) (§R.4.6, §R.10). Это необходимо для гарантии надежности типов.

Отметим, что указатель на член не является указателем на объект или указателем на функцию и правила преобразований таких указателей не применимы для указателей на члены. В частности указатель на член нельзя преобразовать в void*.

R.5 Выражения

Здесь определяются синтаксис, порядок вычисления и назначение выражений. Выражение - это последовательность операций и операндов, которая задает вычисление. Вычисление может выдавать в качестве результата значение и может вызывать побочные эффекты.

Операции могут быть перегружены, т.е. им может быть приписано значение, когда они применяются к выражениям типа класс (§R.9). Применение перегруженных операций преобразуется в вызовы функций в соответствии с описанием в §R.13.4. Перегруженные операции подчиняются синтаксическим правилам, определенным в этом разделе, но требования к типу операнда, адресу и порядку вычисления заменяются на правила вызова функции. Соотношения между операциями, типа ++a означает a+=1, не гарантируются для перегруженных операций (§R.13.4).

В этом разделе описано применение операций к типам, для которых они не являются перегруженными. Перегрузка операций не может изменить правила применения операций к типам, для которых такое применение предусмотрено в самом языке.

Порядок вычисления подвыражений определяется приоритетом и порядком применения операций. Обычные математические правила ассоциативности и коммутативности операций действуют только, если операции действительно ассоциативны или коммутативны. За исключением оговоренных случаев порядок вычисления операндов конкретной операции неопределен. В частности, если в выражении значение изменяется дважды, результат выражения неопределен, если только порядок выполнения не обеспечивается самими операциями, например:

i = v[i++]; // the value of `i' is undefined

i=7, i++, i++; // `i' becomes 9

Реакция на переполнение и деление на нуль при вычислении выражения зависит от реализации. В большинстве существующих реализаций C++ игнорируется переполнение целых. Реакция на деление на нуль и ошибки операций над числами с плавающей точкой варьируется от машины к машине и обычно связана с соответствующими библиотечными функциями.

Кроме оговоренных случаев, операнды типа const T, volatile T, T&, const T& и volatile T& можно использовать, как если бы они имели тип просто T. Аналогично, операнды типа T* const, T*volatile можно использовать, как если бы они имели тип просто T*, за исключением оговоренных случаев. Аналогично, просто тип T можно использовать всюду, где требуется тип volatile T или const T. Эти правила может применять в комбинации, так что const T* volatile можно использовать там, где требуется T*, за исключением оговоренных случаев. При рассмотрении разрешения перегрузки (§R.13.2) такое использование операций не считается стандартным преобразованием операндов.

Если выражение имеет тип "ссылка на T" (§R.8.2.2, §R.8.4.3), значение выражение есть объект типа "T", на который настроена ссылка. Выражение является адресом. Ссылку можно представлять как имя объекта.

Допустимы определенные пользователем преобразования объектов класса в (и обратно) основные типы, указатели и т.д. (§R.12.3) Если они недвусмысленны (§R.13.2), такие преобразования могут применяться транслятором всегда, когда появляется объект типа класса в качестве операнда операции, в качестве инициализирующего выражения (§R.8.4), в качестве выражения, задающего условие (§R.6.4), или в качестве выражения, используемого в операторе цикла (§R.6.5), или в качестве значения, возвращаемого функцией (§R.6.6.3), или в качестве параметра функции (§R.5.2.2).

R.5.1 Первичные выражения

Первичными выражениями являются литералы, имена и имена, определенные с помощью операции разрешения области видимости ::.

первичное-выражение:

 литерал

 this

 :: идентификатор

 :: имя-функции-операции

 :: уточненное-имя

 (выражение)

 имя

Литерал является первичным выражением. Его тип определяется его видом (§R.2.5).

В теле нестатической функции-члена (§R.9.3) служебное слово this обозначает указатель на объект, к которому относится вызов функции. Служебное слово this нельзя использовать вне тела функции-члена класса.

Операция ::, за которой следует идентификатор или имя-операции-функции или уточненное-имя являются первичным выражением. Его тип задается описанием идентификатора, имени или имени-функции-операции. Результатом является идентификатор, имя или имя-функции-операции. Результат является адресом, если идентификатор является адресом. Идентификатор или имя-функции-операции должны иметь файловую область видимости. С помощью операции :: можно обращаться к типу, объекту, функции или элементу перечисления, даже если обозначающий их идентификатор является скрытым (§R.3.2).

Выражение в скобках является первичным выражением, тип и значение которого идентичны им же у выражения без скобок. Наличие скобок не влияет на то, является выражение адресом или нет.

Понятие имя - это определенное первичное-выражение, которое может появляться только после . и -› (§R.5.2.4):

имя:

 идентификатор

 имя-функции-операции

 имя-функции-преобразования

 ~имя-класса

 уточненное-имя

Идентификатор есть имя, при условии что он описан надлежащим образом (§R.7). Понятие имя-функции-операции описано в (§R.13.4), а понятие имя-функции-преобразования в (§R.12.3.2). Конструкция ~имя-класса обозначает деструктор (§R.12.4).

уточненное-имя:

 уточняющее-имя-класса :: имя

Понятие уточняющее-имя-класса, за которым следует :: и имя члена этого класса (§R.9.2), или члена базового по отношению к данному класса (§R.10) является уточненное-имя. Его тип есть тип члена, а результат выражения есть этот член. Результат является адресом, если таковым является член. Имя класса может быть скрыто другим именем (не типа), в таком случае все равно имя класса доступно и его можно использовать. Если используется имя-класса::имя-класса или имя-класса::~имя-класса, оба понятия имя-класса должны обозначать один и тот же класс. С помощью такой записи обозначаются конструкторы (§R.12.1) и деструкторы (§R.12.4) соответственно. Можно использовать уточняющие имена неоднократно, например, N1::N2::N3::n, чтобы обозначать вложенные типы (§R.9.7).

R.5.2 Постфиксные выражения

Постфиксные выражения применяются слева направо.

постфиксное-выражение:

 первичное-выражение

 постфиксное-выражение [выражение]

 постфиксное-выражение (список-выражений opt)

 имя-простого-типа (список-выражений opt)

 постфиксное-выражение . имя

 постфиксное-выражение -› имя

 постфиксное-выражение ++

 постфиксное-выражение --

список-выражений:

 выражение-присваивания

 список-выражений, выражение-присваивания

R.5.2.1 Индексация

Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Интуитивный смысл его индексирование. Первое из выражений должно иметь тип "указатель на T", а второе быть целочисленного типа. Тип результата есть "T". Выражение E1[E2] совпадает (по определению) с выражением *((E1) + (E2)). Подробности операций * и + даны в §R.5.3 и §R.5.7, а массивы обсуждаются в §R.8.2.4.

1 2 3 4 5 6 7 8 9 10 ... 41
Перейти на страницу:
На этой странице вы можете бесплатно скачать Справочное руководство по C++ - Бьярн Страустрап торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит