#14. Переопределение операции присваивания | Уроки ООП C++
Вставка
- Опубліковано 1 кві 2024
- Практический курс по C/C++: stepik.org/course/193691/
Телеграм-канал: t.me/java_and_c
Инфо-сайт: proproprogs.ru/cpp_oop
Переопределение операции присваивания на примере класса динамического массива. Правило трех и правило пяти.
Спасибо. Великолепный пример!
Спасибо большое за твой труд друг!
Вектор. Начало. С нетерпением жду второй части)
Ну что же, очень ждем следующее занятие)
Здравствуйте, Сергей. Скажите, планируются ли на канале какие-то обучающие видео по нейросетям (не по программированию, а по использованию). Про промпты, про какие-то необычные находки. Т.к. вы явно не могли мимо пройти всего того, что растёт каждый день как грибы и умение "разговаривать" с моделями сейчас очень важно будет в перспективе многих деятельностей.
Спасибо очень круто. Делал все по видео, и была такая проблема что capacity после 1 итерации принимал значение сразу 30, плюс были синтаксическая ошибка наверное в команде int *p = new int[capacity]; а писал так int *p = new int{capacity}; оказывается это походу ошибка. А проблему с capacity исправил в 8 строке файла darray.cpp на while (capacity < size_new).
Спасибо еще раз, смотрю, вникаю, нравиться!!!
int *p = new int{capacity};
создает переменную типа int со значением capacity )) Успехов!
Друзья, а почему на 13:05 мы можем сделать return other ? Ведь разве мы не возвращаем ссылку на созданный объект? А у объекта other ведь другой адрес, это ведь отличный объект от *this ?
без разницы, можно и *this вернуть, смысл, что после присваивания состояния обоих объектов равны и возврат делаем, чтобы операция работала по цепочке a = b = c = d
@@selfedu_rus и еще глупый вопрос) а что именно дает возврат этого метода константной ссылки? const DArray& DArray::operator = (const DArray& other). то есть оператор присваивания возвращает объект, константный объект, верно? который мы , по идее, не можем изменить. верно?)
да, его и не нужно менять, это же присваиваемое значение
course.cpp
#include
#include "darray.h"
int main()
{
DArray ar1, ar2;
for(int i=0; i < 10; ++i)
ar1.push_back(i+1);
ar2 = ar1;
std::cout
darray.h
#ifndef _DARRAY_H_ // youtube auto, write without "space":( _ D A R R A Y _ H _)
#define _DARRAY_H_
class DArray {
enum {
start_length_array = 8, // начальная длина массива
resize_factor = 2, // множитель для увеличения длины массива
max_length_array = 30, // максимальная длина массива
value_error = 2123456789, // специальное значение для обозначения ошибки данных
};
int *data {nullptr};
int length {0};
int capacity {0};
void _resize_array(int size_new);
public:
DArray() : length(0), capacity(start_length_array)
{
data = new int[capacity];
}
DArray(const DArray& other) : length(other.length), capacity(other.capacity)
{
data = new int[capacity];
for(int i = 0; i < length; ++i)
data[i] = other.data[i];
}
~DArray() { delete[] data; }
int size() const {return length; }
int capacity_ar() const {return capacity; }
const int* get_data() const {return data; }
const DArray& operator=(const DArray& other);
void push_back(int calue);
int pop_back();
};
#endif
darray.cpp
#include "darray.h"
void DArray::_resize_array(int size_new)
{
if(size_new = max_length_array) {
capacity = max_length_array;
break;
}
}
int *p = new int[capacity];
for(int i = 0; i < length; ++i)
p[i] = data[i];
delete[] data;
data = p;
}
const DArray& DArray::operator=(const DArray& other)
{
if(this == &other)
return other;
length = other.length;
capacity = other.capacity;
delete[] data;
data = new int[capacity];
for(int i = 0; i < length; ++i)
data[i] = other.data[i];
return other;
}
void DArray::push_back(int value)
{
if(length >= capacity)
_resize_array(capacity * resize_factor);
if(length < capacity)
data[length++] = value;
}
int DArray::pop_back()
{
if(length > 0)
return data[--length];
return value_error;
}