|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Итерпритация сложных описаний изнутри наружуОперации *, [], (), & могут разными способами комбинироваться с идентификаторами. Например: При комбинации модификаторов в описании недопустимы варианты: 1) элементами массива не могут быть функции 2) функции не могут возвращать массив. Указатель на функцию может 3) при интерпретации сложных описаний [] и () скобки (они всегда справа от интерпретатора) имеют више приоритет перед * и & (всегда слева от имени) [] и () скобки имеют одинаковый приоритет т связываются слева на право. Спецификатор типа рассматривается на последнем шаге. Можно использовать () для изменения приоритета операций. Интерпретация сложных описаний изнутри снаружи: 1) Начать с идентификатора и посмотреть направо есть ли [] или () скобки. 2) Если они есть разобрать эту часть, описать и затем посмотреть налево в поисках * или &. 3) Если на любом этапе разбора справа встретится закрытая круглая скобка, то применить это правило внутри круглых скобок, а затем продолжить интерпретацию. 4) Интерпретировать спецификацию типа. int * (* comp [10]) (); 42. Ссылки в С++ Ссылки являются другим именем объекта (=синоним, алеас). Главное применение ссылок состоит в определении параметров и возврате значений для функции вообще и для перегруженных операторов в частности. Инициализация: int i=1; int & r= i; //r и i ссылаются на один и тот же int int x=r; // = i =>1 r=2; //=>i=2, мы меняем не r, а то что в этой памяти Ссылка должна быть инициализирована, то есть должно быть что-то, для чего она является именем, инициализация ссылки совершенно отличается от присваиванья ей. Вопреки всем ожиданиям ни одна операция присвоения затем на ссылку не действует, а меняется тот объект, на который она ссылается. int ii = 0; int & rr = ii; rr++; // =ii++ Реализацией ссылки является константный указатель, который разименовуется при каждом использовании. Int k[10]; int *p = & i; p++; //→ на 1 int от i p=k; //= & k[0] // p+N это p + N * sizeof (type) Ссылка – постоянный после инициализации ук-ль. Ссылка используется для реализации функции, которая меняет значение своего параметра (так же как и с ук-лем): Пример1 (ссылка) void incr (int & aa) { aa++; } Пример2 (указатель) void next (int * bb) { (* bb)++; } Пример3 int plus (int cc) {return cc+1;} Пример4 void plus_bad (int dd) {dd++;}
void f () { int x = 1; incr (x); //пр1, x=2 cout << ”x=” << x; next (&x); //пр2, x=2+1=3 int y=plus1 (x); //пр3 cout<<”x+1=”<< plus1 (x); plus_bad (х); //пр4, но х не изменится, т к мы //работали с копией в рабочей памяти (стеке) } Ссылки также можно применять для описания функций, которые могут использоваться в левой части оператора присваивания. Это должны быть функции, которые возвращают тип рез-а ссылка. double & ref (int index); //-прототип можно записывать ref (index)=…; Тонкости при использовании параметров ссылок. void change_value (int & p) { p+=20; cout <<”значение р в change_value=”<<p<<endl;} void main (void) { int x=50; change_value (x); cout<< “x=”<<x; // p=70; x=70; int y=100; change_value (x+y); //p=190 (находится в стеке), //не все компиляторы пропустят cout <<’x=”<<x<<” y = “<<y; //у=100; x=70; т.к. нет //переменной х+у выделилась рабочая память //под вычесленный х+у в стеке и удалилась после //выполнения ф-ции float r=-1,5; change_value (r); //p=19, в р отброс. дробн. часть cout<<”r=”<<r; //r=-1,5, т к преобраз происходило // в доп памяти При выполнении ф-ции создается: int temp =r; //temp=-1 temp+=20; //а когда ф-ции закончится, temp //уничтожится Аргументы, передающиеся по значению, невозможно в вызове (внешне) отличить от аргументов, передающиеся по ссылке. Это компилятор видит из прототипа или заголовка функции.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |