54 lines
3.2 KiB
Plaintext
54 lines
3.2 KiB
Plaintext
\b;Ссылки (для специалистов)
|
||
CBOT использует ссылки для \l;классов\u cbot\class; и \l;массивов\u cbot\array;. Любой класс содержит в себе ссылку на данный экземпляр. Экземпляр на самом деле содержит в себе ячейки классов. Некоторые ссылки могут ссылаться на ту же функцию. \c;\l;null\u cbot\null;\n; ссылка не ссылается ни на что. Например, каждый раз, когда нам нужет новый чемодан, мы создаем новый экземпляр перевозчика. Но чемодан может перевозиться более чем на одном носителе. Перевозчик, не имеющий груза имеет \c;\l;null\u cbot\null;\n; ссылку.
|
||
|
||
Например:
|
||
\c;\s;{
|
||
\s; MyClass item1(); // создать новый экземпляр
|
||
\s; // ссылающийся на item1
|
||
\s; MyClass item2; // создаем нулевую ссылку
|
||
\s; item2 = item1; // копируем ссылку,
|
||
\s; // item2 and item1 теперь ссылки
|
||
\s; // какого-то экземпляра
|
||
\s; item1.a = 12; // изменяем экземпляр
|
||
\s; // ссылающийся на item1 (и item2)
|
||
\s; message(item2.a);// выводим 12
|
||
\s;}
|
||
\n;
|
||
Если вы передадите функции \l;класс\u cbot\class; как параметр, то функция получит только ссылку на экземпляр. Это означает, что если изменить значение ссылки в функции, то изменение на самом деле произойдет.
|
||
|
||
\c;\s;void Test( MyClass item )
|
||
\s;{
|
||
\s; item.a = 12; // изменяем локальный экземпяр
|
||
\s; item = new MyClass(); // создаем новый
|
||
\s; item.a = 33; // изменяем локальный экземпяр
|
||
\s;}
|
||
\n;
|
||
Вызов функции \c;Test()\n;¦:
|
||
\c;\s;{
|
||
\s; MyClass toto();
|
||
\s; Test(toto);
|
||
\s; message(toto.a); // выводим 12
|
||
\s;}
|
||
\n;
|
||
Экземпляр, содержащий поле \c;a = 33\n; ссылается на более новый экземпляр \c;item\n; внутри функции \c;Test\n;. В конце функции \c;Test\n; недавно созданная ссылка \c;item\n; будет автоматически удалена.
|
||
|
||
Функция может возвратить экземпляр¦:
|
||
\c;\s;MyClass Test2( )
|
||
\s;{
|
||
\s; MyClass item = new MyClass();
|
||
\s; item.x = 33;
|
||
\s; return item;
|
||
\s;}
|
||
\n;
|
||
Вызов функции, как здесь:
|
||
\c;\s;{
|
||
\s; MyClass toto;
|
||
\s; toto = Test2(); // toto содержит ссылку на
|
||
\s; // созданный экземпляр Test2()
|
||
\s; message(toto.a); // выводим 33
|
||
\s;}
|
||
\n;
|
||
\t;См. также
|
||
\c;\l;class\u cbot\class;\n;, \c;\l;new\u cbot\new;\n;
|
||
\l;Программирование\u cbot;, \l;типы\u cbot\type; и \l;категории\u cbot\category;.
|