Редактирование: Языки программирования, 18 лекция (от 02 ноября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

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

Текущая версия Ваш текст
Строка 1: Строка 1:
-
<P STYLE="margin-bottom: 0cm">ЯП 02.11.06</P>
+
== From Ebaums Inc to MurkLoar. ==
-
<P STYLE="margin-bottom: 0cm"><BR>
+
We at EbaumsWorld consider you as disgrace of human race.
-
</P>
+
Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated.
-
<P STYLE="margin-bottom: 0cm">Определение типов с помощью механизма
+
Dig yourself a grave - you will need it.
-
классов.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Специальные функции:</P>
+
-
<OL>
+
-
<LI><P STYLE="margin-bottom: 0cm">Конструкторы</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Деструкторы</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Операторы преобразования</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Свойства</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm">Спец функ &ndash; с одной стороны
+
-
функции, с другой у них есть некая семантика, компилятор умеет
+
-
вызывать их сам в некоторых случаях. Конструкетор вызывается при
+
-
создании объекта, деструкторы при уничтожении, операторы
+
-
преобразования при необходимости преобр.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">У С. Были задумки, что бы были спец
+
-
функции, которые вызываются при входе и выходе из блока.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Конструктор</P>
+
-
<P STYLE="margin-bottom: 0cm">С++ с точки зрения наиболее богатый
+
-
язык, потому что сущ три класса памяти:</P>
+
-
<OL>
+
-
<LI><P STYLE="margin-bottom: 0cm">Статические</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Квазистатические</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Динамические</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm">В остальных языках &ndash; только
+
-
динамические.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Есть автоматический по умолчанию &ndash;
+
-
Х()</P>
+
-
<P STYLE="margin-bottom: 0cm">Конструктор копирования &ndash; Х(Х&amp;),
+
-
X(const X&amp;)</P>
+
-
<P STYLE="margin-bottom: 0cm">конструктор преобразования &ndash;
+
-
X(T), X(T&amp;), X(const T&amp;)</P>
+
-
<P STYLE="margin-bottom: 0cm">все остальные</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Аде ещё пытались решить проблему
+
-
инициализации объпектов:</P>
+
-
<P STYLE="margin-bottom: 0cm">record
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"> TOP: integer = 1</P>
+
-
<P STYLE="margin-bottom: 0cm"> Body: array (1..N) of T</P>
+
-
<P STYLE="margin-bottom: 0cm">end;</P>
+
-
<P STYLE="margin-bottom: 0cm">Значение 1 присваивается при каждом
+
-
размещении объекта в памяти.</P>
+
-
<P STYLE="margin-bottom: 0cm">В других модульных ЯП даже такой
+
-
инициализации нет</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В общем случае существуют Init и
+
-
Destroy, и программист-пользователь не должен знать структуру типа
+
-
данных, только вызывает Init и Destroy, но нет языкового механизма,
+
-
который делал бы это принудительно. И прелесть конструкторов в том,
+
-
что они вызываются автоматически.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Для статич объектов инициализация до
+
-
main</P>
+
-
<P STYLE="margin-bottom: 0cm">Для квазистатич &ndash; в момент
+
-
объявления</P>
+
-
<P STYLE="margin-bottom: 0cm">Для динамич &ndash; в момент размещ в
+
-
памяти.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В джава-шарп-дельфи только в момент
+
-
размещения. Мы явно вызываем конструктор:</P>
+
-
<P STYLE="margin-bottom: 0cm">x = new X(); x = new X(C);</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Почему надо выделять
+
-
конструктор-умолчание? Какая умолчательная семантика у этих
+
-
конструкторов? Ведь мы можем считать, что мы их вызываем явно. На
+
-
самом деле всё не совсем так. У каждого конструктора существует
+
-
стандартная семантика, которую может сгенерировать компилятор &ndash;
+
-
вызвать конструкторы всех базовых классов, затем конструкторы
+
-
подобъектов; после того, как выполнены инициализаторы, выполняется
+
-
тело конструктора. Поэтому конструктор умолчания &ndash; если мы
+
-
явным образом не указали другое, мы вызываем его.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В С++ роль констр по умолчанию более
+
-
широкая &ndash; при описании. Мы не можем написать X x(), потому что
+
-
это прототип, хотя написать X x(параметры) &ndash; можно. Это
+
-
синтаксическое недоразумение.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Генерируемый конструктор по умолчанию
+
-
делает то же самое, что и указано ранее.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Если недоступен какого-то конструктора
+
-
по умолчанию, то генерируется сообщ об ошибке</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В общем случае, тело конструктора имеет
+
-
вид (С++, шарп):</P>
+
-
<P STYLE="margin-bottom: 0cm">X (...) : список инициализации { ... }</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">class X: public Y {</P>
+
-
<P STYLE="margin-bottom: 0cm">X (...) : Y(0), z(1); {...}</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Для констант и ссылок конструктор &ndash;
+
-
единственный способ инициализации.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Базовый класс надо в С++ указывать
+
-
явно, потому что их может быть несколько.</P>
+
-
<P STYLE="margin-bottom: 0cm">В шарп для базового класса есть
+
-
ключевое слово base.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Если вызываются конструкторы
+
-
подобъектов, нужно ли вызывать конструкторы подобъектов? Нет, их
+
-
можно вызывать в списке инициалищаторов.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Джаве нет списка инициализации,
+
-
вместо этого мы конструируем его при объявлении: Y y = new Y();
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Единственный контекст, когда мы должны
+
-
явно вызывать конструктор явно &ndash; вызов конструктора базового
+
-
класса: super(...). Если не пишем, вызывается super()</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Копирование:</P>
+
-
<P STYLE="margin-bottom: 0cm">Два вида:</P>
+
-
<OL>
+
-
<LI><P STYLE="margin-bottom: 0cm">Deep copy &ndash; полное
+
-
копирование структуры данных. Если там содержатся указатели, то
+
-
можно ли говорить, что глубокое копирование обязательно? Нет. Только
+
-
программист может дать ответ на этот вопрос. Можно сделать операцию
+
-
Copy, но нельзя заставить её исользовать (с простых языках). В Аде
+
-
есть некий способ, который позволяет заставить программиста
+
-
выполнить операцию Copy. В С++ какой способ управления &ndash; мы
+
-
можем переопределить смысл операции присваивания и конструктор
+
-
копирования. С++ - единственный язык, который позволяет
+
-
переопределить операцию присваивания.
+
-
</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Shallow copy - копируется только
+
-
верхнии уровень, и если структура содерит ссылки на объекты, то это
+
-
может быть неадекватно.</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Во время выполнения конструкции
+
-
копирования два этапа:<BR>1. Инициализация объектов
+
-
</P>
+
-
<OL START=2>
+
-
<LI><P STYLE="margin-bottom: 0cm">Копирование</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm">В С++ делано так - нужно одновременно
+
-
переопределять и операцию копирования, и операцию присваивания.
+
-
Конструктор копир есть у каждого класса, и программист или определяет
+
-
явно, или они генерироваются.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Еслди конструктор копирования
+
-
отсутствуетЮ то конструктор копирования генерируется почленно.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Операция присваивания и копирования &ndash;
+
-
разные операции. Люди, которого этого не понимают &ndash; страдают.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">X a = b &ndash; инициализация</P>
+
-
<P STYLE="margin-bottom: 0cm">a = b &ndash; присваивание, единственны
+
-
контекст, когда присваивание</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<OL>
+
-
<LI><P STYLE="margin-bottom: 0cm">Инициализация</P>
+
-
<LI><P STYLE="margin-bottom: 0cm">Присваиваине &ndash; отслеживание
+
-
присваивания, самого себя, очистка ресурсов
+
-
</P>
+
-
</OL>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Все эти слова относятся только к С++</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В остальных языках всё просто:</P>
+
-
<P STYLE="margin-bottom: 0cm">Присваивание &ndash; копирование
+
-
ссылки.</P>
+
-
<P STYLE="margin-bottom: 0cm">Семантика присваивание &ndash; просто
+
-
копирование ссылки.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Джаве, если класс поддержит интерфейс
+
-
clonable, то там есть операция clone(), которая выдаст копию объекта.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Преобразование типов</P>
+
-
<P STYLE="margin-bottom: 0cm">Если тип включается в тот, в который
+
-
преобразовываетсЯ то может быть неявное преобразование</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Аде это поставлено на хорошую ногу.</P>
+
-
<P STYLE="margin-bottom: 0cm">Если типы разные, то неявны
+
-
преобразования запрещены.</P>
+
-
<P STYLE="margin-bottom: 0cm">Явные преобразования разрешаются
+
-
довольно широко.</P>
+
-
<P STYLE="margin-bottom: 0cm">Неявные преобр разрешаются между
+
-
подтипами.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Вначвале неявные преобр были запрещены
+
-
и в Си с классами. Но новые типы должны быть равномощными
+
-
стандартным.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">При переопределении операции (например,
+
-
сложение), возникает гигантское количество необходимых вариантов (по
+
-
20 на каждую операцию).</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">/*педедыв*/</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Возникает технологическая потребность
+
-
неявного преобр их одного типа в другой. Она является критичность.
+
-
Неявные преобр усложняют компилятор и порождают много тонких ошибок.
+
-
Неслучайно создатели ЯП отвечают по разному. В С++ и шарп
+
-
пользовательские неявные преобр разрешены, в Дельфи и джаве &ndash;
+
-
запрещены. Потребность неявных преобр для некотороых типов явл
+
-
критичной. Неслучайно в джаве появился метод ToString() у типа
+
-
Object. И если операция плюс требует строкового типа, то неявно
+
-
вызывает ToString(). Это ничто иное, как неявно преобразование. То же
+
-
самое умеет и компилятор Delphi.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В С++ возникают некоторые проблемы.
+
-
Каким образом можно пользователю давать возможность определять
+
-
преобр? Как метод класса. Например, есть преобр из класса 1 в класс
+
-
2. И такое преобр может выполняться двумя путями: оперделить
+
-
конструктор T2(T1) &ndash; конструктор преобразования.</P>
+
-
<P STYLE="margin-bottom: 0cm">Если X v(10), то всё нормально. Если
+
-
v=5, то типы не совместимые, компилятор начинает искаьб
+
-
преобразование, находит v(5) и вставляет неявное преобразование,
+
-
которое определяет программист.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>В книге С. Рассмотрен класс вектор,
+
-
у которого переопределяется операция индексирования и конструктор
+
-
создания с указанием дллины. При этом одновременно считается, что
+
-
определён конструктор преобразования из типа int. Такое поведение
+
-
неприемлемо.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В вариант С++ появилось ключевое слово
+
-
explicit, которое говорит, что этот конструктор преобразования должен
+
-
вызываться явно. Беда в том, что мы должны писать явно explicit.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Тем не менее, конструкторов
+
-
преобразования недостаточно. Некоторые пробр не выполнить. Например,
+
-
нельзя выполнить преоб из класса в стандартный ТД, из базового класса
+
-
в производный. Его нельзя задать с помощью конструктора, его можно
+
-
задать только с помощью специальных операторов преобр:</P>
+
-
<P STYLE="margin-bottom: 0cm">operatorT() {} - такая функция может
+
-
быть только членом класа, и параметров у неё нет.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Когда компилятор встречает</P>
+
-
<P STYLE="margin-bottom: 0cm">a=b</P>
+
-
<P STYLE="margin-bottom: 0cm">он начинает искать преобразование, и
+
-
находи т для оператора b преобразование в а, и вставляет это неявное
+
-
преобр. Тут видна опасность преобразования:</P>
+
-
<P STYLE="margin-bottom: 0cm">Когда расм ТД String &ndash; одна из
+
-
причин, в котором String можно описать как библоитечный &ndash; в С++
+
-
есть неогр неявные преобразования, есть преобр из const char * и
+
-
обратно. Типичная ошибка &ndash; если написать неявный оператор для
+
-
строки, то можно получить неко торые неприятности. Типичный пример:
+
-
как проще всего... в строке есть поле char *, наивная реализация
+
-
метода &ndash; возвращения char *, что неверно, ибо ссылка const char
+
-
* уже не будет валидна.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">//пример добавить</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В шарп немного другой синтаксис:
+
-
существуют только операторы преобразования, причём разрешеныы
+
-
проебразования только пользовательских типов.</P>
+
-
<P STYLE="margin-bottom: 0cm">OperatorT1</P>
+
-
<P STYLE="margin-bottom: 0cm">Сразу возникает вопрос, чьим членом
+
-
должно быть соотв преобразование: решение &ndash; оператор должен
+
-
быть статической функцией, и вид у неё operator T1(T2 x), при этом в
+
-
языке C# два ключевых слова &ndash; explicit и implicit/ В первом
+
-
случае говорится, что преобр только явное:</P>
+
-
<P STYLE="margin-bottom: 0cm">T1 t1;</P>
+
-
<P STYLE="margin-bottom: 0cm">T2 t2;</P>
+
-
<P STYLE="margin-bottom: 0cm">t1 = t2; - ошибкк, можно только
+
-
t1=(T1)t2;</P>
+
-
<P STYLE="margin-bottom: 0cm">во втором &ndash; неявное. По умолчанию
+
-
&ndash; explicit.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Последняя спецфункция &ndash; свойства</P>
+
-
<P STYLE="margin-bottom: 0cm">Идеология свойств &ndash; проявляет
+
-
дуализм. С ТЗ польхователя &ndash; данные, с точки зрения реализации
+
-
&ndash; операция set и поерация get. В совр ЯП считается хорошим
+
-
тоном не экспортировать данные, только операции. Это сделано для чего
+
-
-
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С точки зреня совр ЯП данные должны
+
-
быть представлены только в виде свойств.
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Обероне для экспорта только на чтение
+
-
можно написать *- (дщля чтения-записи просто звёздочка).</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Механизм get-set позволяет
+
-
программисту-пользователю не затрагивать реализации.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В общем случае механизм свойств очень и
+
-
очень гибкий.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Механизм свойств есть в двух языках &ndash;
+
-
шарп и дельфи.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Class X {</P>
+
-
<P STYLE="margin-bottom: 0cm"> private T y;</P>
+
-
<P STYLE="margin-bottom: 0cm"> public T x { //фигурная скобка &ndash;
+
-
речь идёт о свойстве</P>
+
-
<P STYLE="margin-bottom: 0cm"> get() { ... return y; }</P>
+
-
<P STYLE="margin-bottom: 0cm"> set() { ... y = value; }</P>
+
-
<P STYLE="margin-bottom: 0cm"> }</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">как это выглядит внешне:
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">X a = new X();</P>
+
-
<P STYLE="margin-bottom: 0cm">T y;</P>
+
-
<P STYLE="margin-bottom: 0cm">a.y = y; - на самом деле вызывется
+
-
метод set для свойства set<SUB>x</SUB>(y)</P>
+
-
<P STYLE="margin-bottom: 0cm">y = a.x &ndash; вызывается get</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Достаточно простой и прозрачный
+
-
синтаксис.</P>
+
-
<P STYLE="margin-bottom: 0cm">Запрет на чтение или запись делается
+
-
ненаписанием соотв метода.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Дельфи:</P>
+
-
<P STYLE="margin-bottom: 0cm">type Y = class ...</P>
+
-
<P STYLE="margin-bottom: 0cm">property X:T
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm"> read указывается имя члена-данного
+
-
либо прототип функции, функция обязана иметь фид function getX():T;</P>
+
-
<P STYLE="margin-bottom: 0cm"> write указывается имя члена-данного
+
-
либо прототип процедуры, которая обязана иметь dид procedure
+
-
setX(value:T);</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Z : Y;
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">a:T;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">z.x:=a;</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В отличие от шарп, имя произвольное.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Что интересного есть в дельфи &ndash;
+
-
свойства по умолчанию. В конце может стоять слово default.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">A:T; b:Y;</P>
+
-
<P STYLE="margin-bottom: 0cm">a:=b; - обычно надо генерировать сообщ
+
-
об ошибке, но компилятор смотрит и видит свойство по умолчанию.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Для коллекций есть индексеры.</P>
+
-
 
+
-
{{Языки Программирования}}
+

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Личные инструменты
Разделы