Все знают, что делфи (паскаль) не тот язык, на котором можно писать всякие нехорошие вещи (ломать, крушить и т д).
Но сегодня мы сломаем этот миф.
Вот код, кто правильно объяснит, что я написал, почему работает и что выводит, получит... ничего получит
[Ссылки могут видеть только зарегистрированные пользователи. ] - Update2
Копия:
Код:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
type
TFTest = class
public
B: string;
function Add(S: string = ''): TFTest;
constructor Create(T: TFTest); overload;
end;
function TFTest.Add(S: string): TFTest;
begin
B := B + S;
Exit(Self);
end;
var
A: TFTest;
constructor TFTest.Create(T: TFTest);
begin
B := T.B;
end;
begin
writeln(TFTest.Create.Add('0')
.Create((TFTest.Create(TFTest.Create(((((((TFTest.Create(TFTest.Create).Add('0')).Add('1').Create.Add('2')
.Add as TObject).Create) as TFTest.ClassParent) as TFTest).Create).Add('3')).Add.Add('4').Create).Add('5')).Add('6')
).Add('7').B);
readln;
end.
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось Рэйзор; 30.04.2012 в 20:40.
Пасаны, а это делфи чтоли? [Ссылки могут видеть только зарегистрированные пользователи. ]
Извини что флужу тут неиного, но не мог бы подсказать где скачать делфи для win7 x32 а то я качаю мне выдает ошибку раньше юзал на xp...
1ooo извенений
Последний раз редактировалось No*Reason; 30.04.2012 в 20:38.
Есть класс TFTest, в которому принадлежит две функции (Add и Create) и переменная B.
Функция Add изменяет переменную B, добавляет в нее строку, которую передали в функцию (если строку не передавали, а просто вызвали функцию переменная B не изменяется).
Функция Create (которая является конструктором класса) присваивает переменной B значение переменной B, которая принадлежит объекту/классу, который передали в функцию.
А еще у нас есть объект А класса TFTest. Но в проге он не задействован.
Что делает программа
Выводит нам значение переменной B
А теперь шаг за шагом посмотрим что происходит с переменной В. Вызывается функция Create, в нее ничего не передается и В не меняется. Далее вызывается функция Add и в нее передается 0 (В=0).
Далее вызывается Create и в нее передается класс TFTest. Функция Create изменяет значение переменной B, делает ее таким как у переданном классе. В данном случаи оно будет 0123456, получается что действие функции (в начале) Add становится бессмысленным.
Смотрим почему 0123456.
Вызывается функция Create, в которую передается класс TFTest, в котором (после всех манипуляций, которые я ниже распишу) переменная В равна 0123.
Почему 0123?
У нас создается класс (вызывается функция Create) в который передается класс TFTest, в котором опять вызывается функция Create (но уже ничего не передается ). Далее в этом классе вызывается функция Add, в которую передаем 0, а потом опять Add с 1 (потом Create, который по сути ниче не делает) и еще раз Add с 2. Далее Add as Object (здесь функция не меняет значение переменной В, так как у нас нету объектов и соответственно ничего не передается). Потом в функцию Create передается класс TFTest, который наследует все свойства у родительского класса (соответственно значение переменной B остается 012). Далее вызывается функция Add, в которую передается 3. И у нас получается значение переменной B = 0123.
После этого Add и Add(4), и В=01234. Далее опять создается класс у которого В уже равно 01234 и вызывается функция Add(5), потом Add(6) и получается что в самом верхнем классе переменная В равна 0123456.
В результате у нас несколько классов TFTest, у которых разные значения В (есть пустые, есть равные 1, есть равные 012....), но на экране мы видим значение переменной В только самого верхнего класса.
Далее вызывается функция Add(7), которая изменяет значение переменной В и у нас получается В=01234567, к котором мы и обращаемся функцией writeln и выводим на экран.
Как бы сказал прапорщик Шматко - "ЙО МА ЙО!!"
ps: спасибо за уроки в чате
________________
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
В любом из нас спит гений. И с каждым днем все крепче.
Запомните раз и навсегда:= 'Помочь' <> 'Сделайте за меня';
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Последний раз редактировалось J-Fobos; 30.04.2012 в 23:02.