java конструктор копирования



Автор Moto задал вопрос в разделе Другие языки и технологии

С++, как вызвать конструктор копирования из другого класса? и получил лучший ответ

Ответ от Николай Веселуха[гуру]
Для реализации собственного конструктора копирования должны быть веские причины, а именно – динамическое выделение памяти. Если при создании объекта фигурирует new, то для неё нужен и delete. Поэтому реализация деструктора также является обязательным. Кроме копирования, когда создаваемый объект инициализируется ранее созданным, есть ещё и присваивание. Это когда один существующий объект присваивается другому существующему объекту. Вот базовые правила, которые нужно выполнять. И тогда с использованием не возникнет никаких проблем. А для явного вызова деструктора нужен убедительный повод, которого как правило возникает крайне редко.
#include <iostream>
using namespace std;
class Test {
public:
// Конструктор без параметров
Test() : ptr(new(nothrow)int) {
if (ptr) *ptr = 0;
}
// Конструктор копирования
Test(const Test& a) {
ptr = new(nothrow) int;
if (ptr) *ptr = *(a.ptr);
}
// Деструктор
~Test() {
if (ptr) delete ptr;
ptr = nullptr;
}
// Оператор присваивания
Test& operator=(const Test& a) {
if (this != &a) {
delete ptr;
ptr = new(nothrow) int;
if (ptr) *ptr = *(a.ptr);
}
return *this;
}
// Получить значение
int get()const { return *ptr; }
// Установить значение
void set(int value) { *ptr = value; }
private:
int* ptr;
};
int main() {
Test a; // Пример вызова конструктора без параметров
cout << a.get() << endl;
Test b;
b.set(20);
a = b; // Пример вызова оператора присваивания
b.~Test();
cout << a.get() << endl;
auto c = a; // Пример вызова констркутора копирования
a.~Test();
cout << c.get() << endl;
c.~Test(); // Пример вызова деструктора
cin.get();
}

Ответ от 3 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: С++, как вызвать конструктор копирования из другого класса?
Конструктор копирования на Википедии
Посмотрите статью на википедии про Конструктор копирования
 

Ответить на вопрос:

Имя*

E-mail:*

Текст ответа:*
Проверочный код(введите 22):*