Skip to content

Commit

Permalink
operator-overload.md
Browse files Browse the repository at this point in the history
  • Loading branch information
nazarpunk committed Oct 16, 2024
1 parent 12e7e47 commit b87c95c
Show file tree
Hide file tree
Showing 24 changed files with 578 additions and 204 deletions.
22 changes: 19 additions & 3 deletions Writerside/AngelScript.tree
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@
<toc-element topic="fun.md">
<toc-element topic="fun-call.md"/>
<toc-element topic="fun-return.md"/>
<toc-element topic="fun-arg.md"/>
<toc-element topic="fun-arg.md">
<toc-element topic="fun-arg-handle.md"/>
</toc-element>
<toc-element topic="main.md"/>
<toc-element topic="funcdef.md"/>
<toc-element topic="fun-overload.md"/>
Expand All @@ -51,7 +53,9 @@
<toc-element topic="loops.md"/>
<toc-element topic="class.md">
<toc-element topic="class-property.md"/>
<toc-element topic="class-method.md"/>
<toc-element topic="method.md">
<toc-element topic="method-const.md"/>
</toc-element>
<toc-element topic="this.md"/>
<toc-element topic="constructor.md">
<toc-element topic="constructor-default.md"/>
Expand All @@ -60,7 +64,19 @@
<toc-element topic="constructor-cast.md"/>
</toc-element>
<toc-element topic="destructor.md"/>
<toc-element topic="class-handle.md"/>
<toc-element topic="operator-overload.md">
<toc-element topic="opCmp.md"/>
<toc-element topic="opCom.md"/>
<toc-element topic="opEquals.md"/>
<toc-element topic="opNeg.md"/>
<toc-element topic="opPostDec.md"/>
<toc-element topic="opPostInc.md"/>
<toc-element topic="opPreDec.md"/>
<toc-element topic="opPreInc.md"/>
</toc-element>
<toc-element topic="class-handle.md">
<toc-element topic="class-handle-lifetime.md"/>
</toc-element>
<toc-element topic="inheritance.md"/>
</toc-element>
</toc-element>
Expand Down
8 changes: 4 additions & 4 deletions Writerside/topics/array-operator.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

Присваивание массивов происходит по значению, то бишь будет создана неглубокая копия массива.

{type="compact"}

`=`
: Присваивание

Expand All @@ -30,7 +30,7 @@ array<string> B = A; // [@A[0],@A[1],@A[2]]

Возвращает элемент на указной позиции с помощью [оператора](operator.md) доступа по индексу.

{type="compact"}

`[]`
: Доступ по индексу

Expand All @@ -45,11 +45,11 @@ int B = A[1]; // 1

Применяет [оператор](operator.md) равенства к каждому элементу массива.

{type="compact"}

`==`
: Равно

{type="compact"}

`!=`
: Не равно

Expand Down
35 changes: 35 additions & 0 deletions Writerside/topics/class-handle-lifetime.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Время жизни

Экземпляры класса умирают когда интерпретатор уйдёт из области видимости, в которой объявлена переменная.

Чтоб освободить принудительно освободить ссылку ей нужно присвоить другое значение или [](null.md).

```C#
class A {
string s;

A(string s){
[[[this|this.md]]].s = s;
}

[[[~|destructor.md]]]A(){
print(s + " destruct\n");
}
}

A@ a; // [[[Глобальные переменные|var.md#global]]] живут до конца игры
void [[[main|main.md]]](){
@a = A("1"); // Создаём экземпляр 1, который не будет уничтожен после завершения функции
@a = A("2"); // Уничтожаем экземпляр 1 поместив на его место экземпляр 2
@a = null; // Принудительно уничтожаем экземпляр 2
A@ b = A("3"); // Создаём экземпляр 3, который будет уничтожен после завершения функции
/* Вывод консоли:
1 destruct
2 destruct
3 destruct
*/
}
```
19 changes: 17 additions & 2 deletions Writerside/topics/class-handle.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
Для объявления ссылки используется оператор `@`. [Изначальным значением](var.md#initial-value) ссылок
является [](null.md).

Ссылка указывает на фактический объект. Для указания того, что вы работаете непосредственно со
ссылкой, а не объектом необходимо использовать оператор `@`.

```C#
class A {
string s = "1";
Expand All @@ -20,5 +23,17 @@ void [[[main|main.md]]](){
}
```

> Обратите внимания, что ссылка указывает на фактический объект и для указания того, что вы работаете необходимо
> использовать оператор `@`.
В некоторых случаях компилятор может сам определить, что необходимо вернуть ссылку на класс и оператор `@` можно
опустить.

```C#
class A {
string s = "2";
}

void [[[main|main.md]]](){
A@ a = A(); // Опускаем оператор @
A@ b = a; // Опускаем оператор @
print(a.s + b.s); // 22
}
```
4 changes: 2 additions & 2 deletions Writerside/topics/constructor-copy.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class A {
}

// Явно объявляем конструктор копирования
A([[[const|var.md#const]]] A [[[&inout|fun-arg.md#inout]]] a) {
A([[[const|var.md#const]]] A [[[&inout|fun-arg-handle.md#inout]]] a) {
s = a.s + "1"; // Добавим единичку, чтоб убедиться в вызове конструктора
}
}
Expand Down Expand Up @@ -77,7 +77,7 @@ class A {
}

// Удаляем конструктор копирования
A([[[const|var.md#const]]] A [[[&inout|fun-arg.md#inout]]]) delete;
A([[[const|var.md#const]]] A [[[&inout|fun-arg-handle.md#inout]]]) delete;
}

void [[[main|main.md]]](){
Expand Down
2 changes: 1 addition & 1 deletion Writerside/topics/constructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
[](https://www.angelcode.com/angelscript/sdk/docs/manual/doc_script_class_construct.html)

Конструкторы класса — это специальные методы, используемые для создания новых экземпляров класса. В отличие
от [методов](class-method.md), конструкторы запрещено вызывать из других конструкторов.
от [методов](method.md), конструкторы запрещено вызывать из других конструкторов.

Конструкторы объявляются без возвращаемого типа и должны иметь то же имя, что и сам класс.
83 changes: 83 additions & 0 deletions Writerside/topics/fun-arg-handle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Аргументы по ссылке

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

## in {id="in"}

Входящая ссылка только для чтения. При работе со строками может сэкономить вам памяти, так как не будет происходить
копирование памяти.

```C#
void A(string& in B){
print(B);
}
string C = "Привет!";
void [[[main|main.md]]] {
A(C); // В функцию будет передана ссылка на переменную, копирование памяти не произойдёт.
A("Допустимо передавать значение напрямую без помещения в переменную");
}
```

> Использование с [примитивами](data-types.md#primitive) допустимо, но бесполезно.
### const {id="in-const"}

При попытке присвоить значение входящей ссылке компилятор сгенерирует ошибку. Посему для пущей оптимизации и явного
указания недопустимости записи рекомендуется явно указывать [const](https://xgm.guru/p/ij/angelscript-function#const):

```C#
void A(string& in B, const string& in C){
B = "Ошибка! Запрещено присваивать значение входящим ссылкам!";
C = "Ошибка! Аргумент C объявлен как const"
}
```

### out {id="out"}

Ссылка для записи выходного значения.

```C#
int divide(int a, int b, int& out remainder) {
remainder = a % b; // записываем остаток от деления в переменную для выхода
return a / b; // возвращаем результат деления
}

void [[[main|main.md]]]() {
int remainder;
int result = divide(10, 3, remainder);
}
```

С помощью ключевого слова `void` можно сделать выходной параметр необязательным.

```C#
int divide(int a, int b, int& out remainder = void) {
remainder = a % b; // записываем остаток от деления в переменную для выхода
return a / b; // возвращаем результат деления
}

void [[[main|main.md]]]() {
int result = divide(10, 3);
}
```

## inout {id="inout"}

Ссылка для входа-выхода. Просто указывает на фактическое значение. Для обеспечения гарантии того, что ссылка будет
существовать всё время существования функции разрешено передавать только ссылочные типы.

> Рекомендуется использовать короткую запись в виде `&`.
```C#
funcdef void A(); // Объявляем сигнатуру функции.
void B(){
print("Функция вызвана по ссылке");
}
void C(A& D){
D(); // Вызываем функцию, переданную по ссылке
};
void [[[main|main.md]]](){
C(@B); // Передаём функцию по ссылке
}
```
84 changes: 0 additions & 84 deletions Writerside/topics/fun-arg.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,87 +58,3 @@ void [[[main|main.md]]](){

> Начальное значение аргумента может включать переменные или вызов функций только если они доступны из глобальной
> области видимости.
## Аргументы по ссылке

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

### in

Входящая ссылка _только_ для чтения. При работе со строками может сэкономить вам памяти, так как не будет происходить
копирование памяти.

```C#
void A(string& in B){
print(B);
}
string C = "Привет!";
void [[[main|main.md]]] {
A(C); // В функцию будет передана ссылка на переменную, копирование памяти не произойдёт.
A("Допустимо передавать значение напрямую без помещения в переменную");
}
```

> Использование с [примитивами](data-types.md#primitive) допустимо, но бесполезно.
#### const {id="in_const"}

При попытке присвоить значение входящей ссылке компилятор сгенерирует ошибку. Посему для пущей оптимизации и явного
указания недопустимости записи рекомендуется явно указывать [const](https://xgm.guru/p/ij/angelscript-function#const):

```C#
void A(string& in B, const string& in C){
B = "Ошибка! Запрещено присваивать значение входящим ссылкам!";
C = "Ошибка! Аргумент C объявлен как const"
}
```

### out

Ссылка для записи выходного значения.

```C#
int divide(int a, int b, int& out remainder) {
remainder = a % b; // записываем остаток от деления в переменную для выхода
return a / b; // возвращаем результат деления
}

void [[[main|main.md]]]() {
int remainder;
int result = divide(10, 3, remainder);
}
```

С помощью ключевого слова `void` можно сделать выходной параметр необязательным.

```C#
int divide(int a, int b, int& out remainder = void) {
remainder = a % b; // записываем остаток от деления в переменную для выхода
return a / b; // возвращаем результат деления
}

void [[[main|main.md]]]() {
int result = divide(10, 3);
}
```

### inout {id="inout"}

Ссылка для входа-выхода. Просто указывает на фактическое значение. Для обеспечения гарантии того, что ссылка будет
существовать всё время существования функции разрешено передавать только ссылочные типы.

> Рекомендуется использовать короткую запись в виде `&`.
```C#
funcdef void A(); // Объявляем сигнатуру функции.
void B(){
print("Функция вызвана по ссылке");
}
void C(A& D){
D(); // Вызываем функцию, переданную по ссылке
};
void [[[main|main.md]]](){
C(@B); // Передаём функцию по ссылке
}
```
Original file line number Diff line number Diff line change
@@ -1,23 +1,4 @@
# Методы класса

[](https://www.angelcode.com/angelscript/sdk/docs/manual/doc_script_class_methods.html)

Методы это функции, которые привязаны к экземпляру [класса](class.md).

```C#
class A {
void a(string b) {
print(b);
}
}

void [[[main|main.md]]](){
A a;
a.a("Вызываем метод класса и передаём ему строку аргументом");
}
```

## const
# const

Классы добавляют новый тип [перегрузки функций](fun-overload.md) - `const` перегрузку.

Expand Down
18 changes: 18 additions & 0 deletions Writerside/topics/method.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Методы класса

[](https://www.angelcode.com/angelscript/sdk/docs/manual/doc_script_class_methods.html)

Методы это функции, которые привязаны к экземпляру [класса](class.md).

```C#
class A {
void a(string b) {
print(b);
}
}

void [[[main|main.md]]](){
A a;
a.a("Вызываем метод класса и передаём ему строку аргументом");
}
```
Loading

0 comments on commit b87c95c

Please sign in to comment.