Копирующий конструктор
Копирующий конструктор — это специальный конструктор, который позволяет создавать копию класса без создания промежуточного класса.
Без специального конструктора копирования с помощью конструктора по умолчанию будет создан новый экземпляр класса. Затем с помощью метода opAssign
в него будут скопированы все значения свойств.
class A {
string s;
A(){
print("При создании экземпляра b в этом примере будет вызван [[[конструктор по умолчанию|constructor-default.html]]]");
}
A(string s){
[[[this|this.html]]].s = s;
}
}
void [[[main|main.html]]](){
A a("a");
A b = a; // Создаём копию класса
print(a.s + b.s); // aa
}
Конструктор копирования позволяет не создавать конструктора по умолчанию и вручную определить поведение при копировании.
class A {
string s;
A(){
print("При создании экземпляра b в этом примере НЕ будет вызван [[[конструктор по умолчанию|constructor-default.html]]]");
}
A(string s){
[[[this|this.html]]].s = s;
}
// Явно объявляем конструктор копирования
A([[[const|var.html#const]]] A [[[&inout|fun-arg-handle.html#inout]]] a) {
s = a.s + "1"; // Добавим единичку, чтоб убедиться в вызове конструктора
}
}
void [[[main|main.html]]](){
A a("a");
A b = a; // Создаём копию класса
print(a.s + b.s); // aa1
}
delete
Конструктор копирования можно удалить используя ключевое слово delete
.
class A {
string s;
A(){
print("При создании экземпляра b в этом примере будет вызван [[[конструктор по умолчанию|constructor-default.html]]]");
}
A(string s){
[[[this|this.html]]].s = s;
}
// Удаляем конструктор копирования
A([[[const|var.html#const]]] A [[[&inout|fun-arg-handle.html#inout]]]) delete;
}
void [[[main|main.html]]](){
A a("a");
A b = a;
print(a.s + b.s); // aa
}
Last modified: 16 October 2024