АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Static_cast – безопасное преобразование, не содержит за собой инструкций процессора

Читайте также:
  1. A) представляет собой соотношение нормы резервирования депозитов к коэффициенту депонирования
  2. Анализатор – это сложная нейродинамическая система, которая представляет собой афферентную часть рефлекторного аппарата.
  3. Блок 2. Содержит 2 задания
  4. В 4. Организация обучения и проверки знаний по охране труда на предприятии. Основные требования и порядок разработки инструкций по ОТ.
  5. В уме своем я создал мир иной, И образов иных существованье, Я цепью их связал между собой, Я дал им вид, но не дал им названья.
  6. Взаимодействие памяти и процессора.
  7. Внутреннее построение микропроцессора. Регистры.
  8. Данный принцип представляет собой правило, в соответствии с которым арбитражный суд исследует доказательства и фиксирует полученную устным путем информацию в письменной форме.
  9. Жюри оставляет за собой право снимать с конкурса работы, не отвечающие требованиям к оформлению, а также работы, поданные в нарушение закона об интеллектуальной собственности.
  10. Зарницы (молнии без грома), которые до сих пор не имеют научного объяснения, в действительности представляют собой грозу в параллельном мире.
  11. Инвестиция являются частью совокупных расходов. Вместе с тем, их можно рассматривать как инъекции в поток доходов, т.к. они представляют собой изъятие части средств на сбережения.

 

Существует четыре оператора преобразования типа в С++:

 

reinterpret_cast<тип>(переменная)

static_cast<тип>(переменная)

const_cast<тип>(переменная)

dynamic_cast<тип>(переменная)

 

reinterpret_cast позволяет отключить контроль типов данных на уровне компилятора, с помощью него любой указатель может быть интерпретирован, как любой другой указатель, а также любая память или переменная может быть интерпретирована иначе. В программах этот оператор преобразования типа использовать не следует, так как он нарушает переносимость программ. Его наличие свидетельствует о том, что программа не является кросс-платформенной. Обычно такое приведение типа применяется для низкоуровневого, зависящего от реализации программирования.

 

int i;

char* p;

p = reinterpret_cast<char *>(&i);

 

static_cast используется вместо преобразования тип(переменная), (тип)переменная и (тип)(переменная) при работе с классами, структурами и указателями на них. Он задуман по причине того, что в С++ выражение тип(переменная) может оказаться вызовом конструктора. Если в программе требуется преобразовать тип, а не вызвать конструктор типа, используется данный оператор. Кроме того, оператор (тип)переменная или (тип)(переменная) может в некоторых случаях оказаться преобразованием reinterpret_cast<тип>(переменная), а при разработке кросс-платформенных программ оператор reinterpret_cast всегда содержит потенциальную опасность неправильной работы программы на другой платформе. Поэтому вместо операторов тип(переменная), (тип)переменная и (тип)(переменная) следует использовать операторы reinterpret_cast и static_cast, которые убирают не явность из преобразования. Так как оператор static_cast является громоздким, то для простых типов данных допустимо использование форм: (тип)переменная и(тип)(переменная). Форма тип(переменная) не должна использоваться для преобразования типа. Static_cast допустима только в том случае, если _тип_ может быть неявно преобразовано в тип, который имеет выражение, или наоборот. В любом другом случае приведение типа вызывает ошибку.


 

Сonst_cast используется для приведения не константных указателей к константным и наоборот:

 

void f2(char* s);

void f1(const char* s)

{

...

f1(const char*s);

...

f2(const_cast<char>(s))

...

};

 

Операция const_cast предназначена исключительно для приведения типа, если значение имеет тип const или volatile.

 

const cast < имя_типа > (выражение)

 

Результатом такого приведения типа будет ошибка, если любые другие аспекты типов не совпадают. То есть имя_типа и выражение должны быть одного типа, за исключением того, что они могут отличаться только наличием или отсутствием const или volatile.

 

Операция const_cast не во всем хороша. Она может изменить указатель на величину, но эффект от изменения значения, заданного как const, не определен.

 

void change (const int * pt, int n);

 

int main ()

{

int pop l 38383;

const int рор2 = 2000;

change (& pop1, - 1);

change (& pop2, - 1);

 

void change (const int * pt, int n)

{

int * ре;

if (n < 0)

{

ре = const_ cast<int *> (pt);

*ре = 100;

}

}

 

Так как рор2 объявлен как const, компилятор может защитить его от изменения, как показано в следующем выводе программы:

 

рор1, рор2: 38383, 2000

рор1, рор2: 100, 2000

 

В данном случае компилятор создает временную копию рор2 и присваивает ее адрес ре, но, как уже

говорилось, в стандарте С++ данная ситуация называется неопределенной.

dynamic_cast соответствует оператору as в Delphi. Для работы этого оператора нужно в опциях компилятора включить опцию RTTI. Если это выполнено, то оператор dynamic_cast работает, как static_cast. Оператор dynamic_cast работает по-разному в зависимости от того, применяется он к ссылке на объект (&) или указателю на объект (*). Если оператор применяется к ссылке на объект, то преобразование не может быть выполнено и возникает исключительная ситуация. Если он применяется к указателю на объект и преобразование не может быть выполнено, оператор возвращает NULL.

17. Ссылки в языке C++. Рекомендации по работе со ссылками. Типичные ошибки при работе со ссылками.

 

Ссылки в языке C++

 

Ссылка является альтернативным именем объекта и объявляется следующим образом:

 

int i;

int &r = i;

 

Использование ссылки r эквивалентно использованию переменной i. Основное применение ссылок – передача параметров в функцию и возврат значения. В случае, когда ссылка используется в качестве параметра функции, она объявляется неинициализированной:

 

void f(int &i);

 

Во всех остальных случаях ссылка должна инициализироваться при объявлении, как показано ранее. Если ссылка является полем класса, она должна инициализироваться в конструкторе класса в списке инициализации до тела конструктора. При использовании в качестве параметров функций ссылки соответствуют var-параметрам в языке Delphi:

procedure P(var i: Integer);

 

Константные ссылки соответствуют const-параметрам в языке Delphi:

 

procedure P(const i: Integer);

 

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

 

Cсылка во многом подобна указателю в замаскированной записи, где операция разыменования * предполагается неявно. И, фактически, это в какой-то степени именно то, чем является ссылка. Однако между ссылками и указателями существуют различия помимо обозначений. Одно из таких различий состоит в том, что ссылку необходимо инициализировать в момент ее объявления. Нельзя сначала объявить ссылку, а затем присвоить ей значение.

 

Ссылка во многом аналогична указателю со спецификатором const. Ее следует инициализировать в момент создания, после чего ссылка остается привязанной к определенной переменной до конца программы. Таким образом, конструкция

int & rodents = rats;

 

по сути, является замаскированной записью выражения, подобного следующему:

 

int const * pr = &rats;

 

В данном случае ссылка rodents играет ту же роль, что и выражение *pr.

{

int rats = 101;

int & rodents = rats; // rodents - это ссылка

 

int bunnies = 50;

rodents = bunnies;

}

Программа генерирует следующий вывод:

rats = 101, rodents = 101

адрес rats = Ox0065f d44, адрес rodents = Ox0065fd44

bunnies = 50, rats = 50, rodents = 50

адрес bunnies = Ox 0065fd48, адрес rodents = O0065f d4

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.)