Я наконец-то вернулся продолжать обучение, а то с этой работой времени не было вообще весь июнь, теперь продолжаем напрягать извилины, которых уже не так много)) Спасибо за уроки, вы достаточно хорошо объясняете, удачи вам во всём. После прошлых уроков, этот каким-то лёгким показался)
Решил сначала написать сам, исходямиз знаний предыдущих уроков, и все получилось. Советую тем, кто поняли как работает перегрузка операторов сначала попробовать написать самим)
Отличный урок! Не знаю, как вы, но я сначала ставлю на паузу и стараюсь сам написать нужный код, а потом смотрю, как это делает профи. Так вот - было смешно, когда я в итоге написал логику сравнения, за которую меня бы засмеяли! Но в этом и есть прелесть обучения
Не просто было, но после тщательного повтора все получилось как здесь. Нужно быть очень внимательными в этим делах (особенно для последних уроков #82 и #83). Это уже не совсем для новичков. Автор супер - почти на уровне Страструпа и к тому же на рус. с хорошей дикцией и красноречием. Здесь таких аналогов на рус. по плюсам пока нет.На этом фоне преподавание в уч. заведениях и в соц. на рус. по полюсам - полный отстой. Также респект автору за популяризацию современного оптимального стиля программирования.
вот дома сижу программирование учу, скоро курсы и чтобы не отставать заранее подучиваю (сеебался после 9, Батя сказал что в колледжах в ничему не научат и сказал учи дома и на курсы частные ходи) 2.5 года длительность на разработчика ПО
Круто пошел бы но я живу в Астане(страна Казахстан прямо под Россией) буду ходить на курсы в КомпАкадем ШАГ, почитал про 21-школу рилл круто то что принимают по навыкам и тестированию к тому же бесплатно, везет вам в Москве)
можно сделать немного короче bool operator == (const MyClass& other) { if (Size != other.Size) return false; for (int i = 0; i < Size; i++) { if (data[i] != other.data[i]) return false; } return true; }
еее остановил видео в начале и сделал эти две перегрузки для класа с масивом (data) довольно легко, дальше смысла смотреть этот видос нету, но лайк и комент для продвижения обязателен!)
Как мне кажется, оператор "не равно" реализован неправильно. Он будет выдавать true только в том случае, когда сразу и иксы, и игреки не равны. Но чтобы точки были разными, достаточно, чтобы либо x, либо y не совпадали. поэтому && стоило бы заменить на || хотя это уже если придираться к смыслу. Спасибо за урок!
А мне кажется, что в перегрузке оператора != лучше использовать ||, чем &&, ведь если одно поле первого будет равно полю второго, а другое поле не будет равно, то все равно выведется false. Но урок все равно отличный, как и все предыдущие и будущие. Спасибо большое!
Сергей, подскажите, пожалуйста, как лучше писать перегрузку оператора равенства? думаю между вашим вариантом и вот таким(через дружественную функцию делаю, так как операнды не изменяются): bool operator==(const Point &p1, const Point &p2) { return p1==p2; } и соответственно перегрузка оператора != будет bool operator!=(const Point &p1, const Point &p2) { return !(p1==p2); }
Кому интересна реализация оператора равенства для класса массива, вот как я его реализовал. Критику приветствую) bool operator == (ArrClass& other) { if (this->dataSize != other.dataSize) return false; for (int i = 0; i < dataSize; ++i) { if (data[i] == other.data[i]) continue; else return false; } return true; }
только хотя бы вот так: bool operator == (ArrClass& other) { if (this->dataSize != other.dataSize) return false; for (int i = 0; i < dataSize; ++i) { (data[i] == other.data[i]) ? continue : return false; } return true; } а то читать невозможно...
Великолепные уроки! Но есть вопрос. А почему не сделать так? bool operator ==(const Point &other) { return x == other.x && y == other.y; } bool operator !=(const Point &other) { return !operator==(other); }
@@КамаПуля-э7д А ты уверен? Мне кажется, что ты немного(много) так ошибаешься, всё работает, челик забыл скобки, когда писал {return !(operator ==(other));}, после такого изменения всё заработало
Не знаю как люди понимают этот урок, но не понимают предыдущий... Лично я понял эту тему исключительно благодаря пониманию предыдущей. Если бы не пример с присваиванием, я бы до сих пор путался в порядке, какой объект this, левый или правый, а какой other. А так, теперь понимаю, что this - a. Фактически "a == b" == " a.operator==(b);", отсюда и понимание, что есть что (что есть this, а что является other).
А не проще ли не дублировать код при отрицательной проверке (!=)? Можно как вариант написать функцию проверки так: bool operator !=(const Point & other) { return !(*this == other); }
Спасибо огромное за урок, все понятно) Но возник один вопрос: если у объекта по 100 полей, и я должен сравнивать по всем полям, то мне сравнение по каждому полю прописывать нужно?
Если кто-то пишет перегрузку операторов == и != для класса MyClass и испытывает трудности, то вот вам готовые решения, я уже эти трудности испытал. 1) Для оператора == в классе: bool operator ==(MyClass const& s) { cout
Спасибо за урок! Возник еще такой вопрос: если я хочу сравнить три переменные класса Point, то как мне это сделать? Мне не даст так просто при такой реализации написать например Point a(4, 2); Point b(4, 2); Point c(4, 3); bool result; result = a == b == c; Если с присваиванием прописали return *this, то тут так не получится, ведь здесь у нас перегрузка типа bool Мне кажется я чего-то недопонимаю...
есть небольшое непонимание почему нельзя сделать вот так: bool Point::operator!= (const Point& right) { return this->x != right.x && this->y != right.y; } при этом, оператор работает как логическое "или". но: bool Point::operator!= (const Point& right) { return this->x != right.x || this->y != right.y; } работает как положено.
Кажется сам допер. Для решения без скобок и инвертирования всего выражения. Напишу, если кто задался вопросом: при сравнении одинаковых значений "Х" в левой части результат будет "0" и компилятор игнорирует правую часть, т.к. результат сравнения "0" с чем-либо даст "0", а поэтому необходимо проверять обе части выражения и использовать логическое "или" - "||".
Наверное потому что изначально "a" сравнивается с "b" a == b? / a.operator==(b); Как вызывался бы и метод класса через обьект Поэтому для объекта a вызывается перегруженный оператор и в this это будет "a", а в other - "b"
у меня возвращает true при любых значениях x, y, так и не нашел в чем косяк( хехе нашел ошибку случайно через несколько видео, конструктор принимающий значения x, y был пустой просто)
@@JTmartShturmannVideo нет косяка, есть такие законы логики - законы де Моргана. Один из них: !(a&&b)==!(a) || !(b) (только здесь == это тождественное равенство(например число Пи тождественно равно 3,14...., не логическое) У Сергея !(a&&b) , а у Вас !(a) || !(b) ;)
почему никто не пишет что можно было просто вызвать обычное сравнения и потом инвертировать результат, в видео обычное нарушения D.R.Y. а вот метод более красив и понятен: bool operator!=(const Point &other) { return !(*this == other); }
@@sleepyNovember_project Ты разыменовываешь указатель и таким способом получаешь доступ к текущему объекту. Это то же самое, если бы была возможность писать this->object. Ты можешь получать доступ и к полям класса таким образом (*this).Size != other.Size вместо того, чтобы писать this->Size. Ну это так, для примера
@@illiahimself это всё понятно, но я не понял, зачем конкретно здесь разименование целого объекта, то есть значит именно сравнивается по соответствию всех значений полей в объекте или как?
@@sleepyNovember_project у тебя есть перегруженный оператор "==" и этим ретурном ты заходишь в этот оператор и возвращаешь обратный результат в перегруженный оператор "!=". В операции this == other у тебя сравниваются указатель и ссылка на объект и ты не можешь производить такое сравнение (типа указателя и типа объекта), поэтому чтобы получить доступ к объекту и произвести их сравнение тебе нужно разыменовать указатель. Ну и после этого ты заходишь в оператор "==" и там производится сравнение по тому, какую логику ты там заложил
Кто сможет решить эту задачу:21. Задача на взаимодействие между классами. Разработать систему «Интернет-магазин». Товаровед добавляет информацию о Товаре. Клиент делает и оплачивает Заказ на Товары. Товаровед регистрирует Продажу и может занести неплательщика в «черный список».
@@Nurdastg да,но какой мне в этом интерес?Там нужно делать примерно это,но чуть сложнее: MyClass arrMyClass[1]{}; int var = 1,i = 0; arrMyClass[i].setValueA(var);
кому мб нужен код для реализации для класса MyClass: в private создаем int count = 0; bool operator==(const MyClass& other) {
if (this->Size == other.Size) { for (int i = 0; i < other.Size; i++) { if (this->data[i] == other.data[i]) count++; } } return count > 0 ? true : false; } код покажется топорным, но он работает и я сам до него додумался ;)
молодец, что как минимум понял, ведь ты расширил познания о программировании, и даже если это не понадобится тебе, то ты не зря потратил время. Н-р, на таких языках как C# такой проблемы нет, и ты будешь получить наслаждение от написания кода на нем, ведь ты знаешь, что как на самом деле это делать вручную. Понадобиться это может, если будешь делать какие-нибудь реальные проекты, грубо говоря, при обычном программировании я часто юзаю проверку на равенство переменных. Было бы странно, если бы данной нужды не было при использовании объектов).
Хочу предостеречь тех, кто попытается так сделать. Сравниваем Point(5, -2) и Point(-2, 5): x1 = 5, x2 = -2, y1 = -2, y2 = 5 !((5 - (-2)) + ((-2) - 5)) = !(7 + (-7)) = !(0) = true Соответственно, Point(5, -2) = Point(-2, 5), что, очевидно, неверно. Все дело в том, что целочисленные операции не эквивалентны булевым. Если же сильно хочется, то можно выполнить следующее преобразование (любопытствующим - гуглить "законы де Моргана"): NOT (A OR B) = (NOT A) AND (NOT B). Таким образом, получаем выражение !(x1 - x2) && !(y1 - y2). Здесь выражения !(...) примут значение true только тогда, когда в скобках будет 0, т.е. соответствующие координаты равны между собой. Значение же всего выражения станет true только тогда, когда оба выражения !(...) тоже будут true, т.е. тогда, когда x1 = x2 и y1 = y2
Очень легко смотрится после 82 и 83 урока, спасибо вам большое, как всегда
Ну конкретно это видео крайне понятное, а вот на предыдущем я чето совсем завис..
@@rocker5652 Не ты один.
@@speedwagoooon8740 +
+
@@rocker5652 надо пересматривать несколько раз и никуда не спешить.
После 82 - 83 аж relax. Понятно и просто. Спасибо за урок
Перегрузка оператора равенства == и не равно !=. Перегрузка логических операторов сравнения. C++ Для начинающих. Урок#84
Благодарен за Ваш труд. С уважением Павел Иванович.
Благодарю за поддержку!
очень круто, спасибо что делаешь эти видосы, а то без них вообще бы загнулся
Всё понятно и легко, хоть и не с первого раза доходит. Спасибо вам, Сергей, за ваши старания!!!
Я наконец-то вернулся продолжать обучение, а то с этой работой времени не было вообще весь июнь, теперь продолжаем напрягать извилины, которых уже не так много)) Спасибо за уроки, вы достаточно хорошо объясняете, удачи вам во всём. После прошлых уроков, этот каким-то лёгким показался)
Ну что, чего вы добились за 4 года?
Решил сначала написать сам, исходямиз знаний предыдущих уроков, и все получилось. Советую тем, кто поняли как работает перегрузка операторов сначала попробовать написать самим)
тоже самое)
#перегрузкаоператоров #ООП #SimpleCode #урокипрограммирования
Ну это уже полегче чем перегрузка оператора присваивания))))
Отличный урок! Не знаю, как вы, но я сначала ставлю на паузу и стараюсь сам написать нужный код, а потом смотрю, как это делает профи. Так вот - было смешно, когда я в итоге написал логику сравнения, за которую меня бы засмеяли! Но в этом и есть прелесть обучения
Не просто было, но после тщательного повтора все получилось как здесь. Нужно быть очень внимательными в этим делах (особенно для последних уроков #82 и #83). Это уже не совсем для новичков. Автор супер - почти на уровне Страструпа и к тому же на рус. с хорошей дикцией и красноречием. Здесь таких аналогов на рус. по плюсам пока нет.На этом фоне преподавание в уч. заведениях и в соц. на рус. по полюсам - полный отстой. Также респект автору за популяризацию современного оптимального стиля программирования.
Это тема для новичков, даже я, новичок это понимаю
Тема новичковая, начало ООП самое. Сложно будет дальше
Спасибо за урок.
На многих роликах 0 дизлайков
0 ничего не понявших школьников. Не может не радовать:)
школьники до ооп не доходят
вот дома сижу программирование учу, скоро курсы и чтобы не отставать заранее подучиваю (сеебался после 9, Батя сказал что в колледжах в ничему не научат и сказал учи дома и на курсы частные ходи) 2.5 года длительность на разработчика ПО
появились ещё такие штуки как школа 21 в Москве ну и у нас UNIT Factory есть, лол.
Круто пошел бы но я живу в Астане(страна Казахстан прямо под Россией) буду ходить на курсы в КомпАкадем ШАГ, почитал про 21-школу рилл круто то что принимают по навыкам и тестированию к тому же бесплатно, везет вам в Москве)
@@naikvitlich1093 я в Киеве, но ваших у нас есть норм так, прикольные ребята, я в этом году поступил
Спасибо за урок, как всегда) очень хочется по с# такие же уроки
Пожалуйста! C# обязательно будет, но позже =)
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
Спасибо, после предыдущих двух роликов это кажется легким!
найс понятненько и просто
привет из 2023, спасибо большое за уроки!
как всегда лучший!
Сергей, спасибо за уроки, благодаря предыдущим получилось написать оператор равенства самому)
очень доступно и понятно! Просто супер
можно в main инвертировать вот так :
bool res = !(a == b);
Комментарий для продвижения. Спасибо
Для массивов
bool operator== (const myclass& other)
{
if (!(this->Size == other.Size))
{
return false;
}
for (int i = 0; i < this->Size; i++)
{
if (this->arr[i] == other.arr[i])
{
continue;
}
else
{
return false;
}
}
return true;
}
можно сделать немного короче
bool operator == (const MyClass& other) {
if (Size != other.Size) return false;
for (int i = 0; i < Size; i++) {
if (data[i] != other.data[i]) return false;
}
return true;
}
Спасибо за видео!
Спасибо за урок! Спасибо за знания! Лайк, однозначно!
Спасибо за знания !
Спасибо
еее остановил видео в начале и сделал эти две перегрузки для класа с масивом (data) довольно легко, дальше смысла смотреть этот видос нету, но лайк и комент для продвижения обязателен!)
Очередное огромное спасибо
Спасибо. Объяснение очень понятное.
Как мне кажется, оператор "не равно" реализован неправильно. Он будет выдавать true только в том случае, когда сразу и иксы, и игреки не равны. Но чтобы точки были разными, достаточно, чтобы либо x, либо y не совпадали. поэтому && стоило бы заменить на ||
хотя это уже если придираться к смыслу. Спасибо за урок!
Вообще можно было просто инвертировать результат вычисления оператора проверки на равенство (он ведь уже готов)
return !(*this == other);
А мне кажется, что в перегрузке оператора != лучше использовать ||, чем &&, ведь если одно поле первого будет равно полю второго, а другое поле не будет равно, то все равно выведется false. Но урок все равно отличный, как и все предыдущие и будущие. Спасибо большое!
Не только тебе так кажется. think about it /(o_o)
@@nexusgaming1912 почему нельзя юзать ИЛИ ? Должно же работать....
Спасибо!
Перегрузил для класса мойкласс все получилось, спасибо за урок
Ну это естественно лайк!)
В прошлых уроках разбирали перегрузку для динамически выделенных массивов, так что целесообразнее было показать перегрузку на примере этих же массивов.
Кому нужно, вот часть кода для массивов:
// перегрузка оператора ==
bool operator == (const MyClass& other) {
if (this->size != other.size) { return false; }
else {
for (int i = 0; i < other.size; i++) {
if (this->data[i] != other.data[i]) {
return false;
}
}
}
return true;
}
// перегрузка оператора !=
bool operator != (const MyClass& other) {
if (this->size != other.size) { return true; }
else {
for (int i = 0; i < other.size; i++) {
if (this->data[i] != other.data[i]) {
return true;
}
}
}
return false;
}
наконец-то урок который я полностью понял)
Спасибо огромное!
Сергей, подскажите, пожалуйста, как лучше писать перегрузку оператора равенства? думаю между вашим вариантом и вот таким(через дружественную функцию делаю, так как операнды не изменяются):
bool operator==(const Point &p1, const Point &p2)
{
return p1==p2;
}
и соответственно перегрузка оператора != будет
bool operator!=(const Point &p1, const Point &p2)
{
return !(p1==p2);
}
Все четко!
Спасибо!🥰
Кому интересна реализация оператора равенства для класса массива, вот как я его реализовал. Критику приветствую)
bool operator == (ArrClass& other) {
if (this->dataSize != other.dataSize) return false;
for (int i = 0; i < dataSize; ++i) {
if (data[i] == other.data[i]) continue;
else return false;
}
return true;
}
только хотя бы вот так:
bool operator == (ArrClass& other)
{
if (this->dataSize != other.dataSize) return false;
for (int i = 0; i < dataSize; ++i)
{
(data[i] == other.data[i]) ? continue : return false;
}
return true;
}
а то читать невозможно...
Великолепные уроки! Но есть вопрос.
А почему не сделать так?
bool operator ==(const Point &other) { return x == other.x && y == other.y; }
bool operator !=(const Point &other) { return !operator==(other); }
Так не получится потому что
@@md.403 можете объяснить последний ваш абзац. Не очень понял ,что такое not_equal_1
@@КамаПуля-э7д А ты уверен? Мне кажется, что ты немного(много) так ошибаешься, всё работает, челик забыл скобки, когда писал {return !(operator ==(other));}, после такого изменения всё заработало
@@andreyvolkov3117 2 года прошло с того момента как я оставил комментарий, думаешь, я помню, о чем он был?
@@КамаПуля-э7д ну, будут люди, так они хоть прочитают и поймут, что работает
Спасибо, очень сильно помог
Не знаю как люди понимают этот урок, но не понимают предыдущий... Лично я понял эту тему исключительно благодаря пониманию предыдущей. Если бы не пример с присваиванием, я бы до сих пор путался в порядке, какой объект this, левый или правый, а какой other. А так, теперь понимаю, что this - a. Фактически "a == b" == " a.operator==(b);", отсюда и понимание, что есть что (что есть this, а что является other).
А вы можете организовать донаты, мне кажется многие бы поддержали ваш канал) я+
Небольшой косяк на превью. Изображён оператор присваивания.
Сергей вы лучший)
5.35 - или очень тонкий тролль, или.. одно из двух..)))
ребят, обязательно ли смотреть стрим или можно пропустить?
А не проще ли не дублировать код при отрицательной проверке (!=)?
Можно как вариант написать функцию проверки так:
bool operator !=(const Point & other)
{
return !(*this == other);
}
Мне кажется это менее оптимизировано
@@milsnel когда кажется, надо обосновывать. В моем условии всего лишь одна проверка, что может быть оптимизированней
-ONE LESSON, +ONE PROFIT!
Спасибо огромное за урок, все понятно) Но возник один вопрос: если у объекта по 100 полей, и я должен сравнивать по всем полям, то мне сравнение по каждому полю прописывать нужно?
Используй циклы !
Если кто-то пишет перегрузку операторов == и != для класса MyClass и испытывает трудности, то вот вам готовые решения, я уже эти трудности испытал.
1) Для оператора ==
в классе:
bool operator ==(MyClass const& s) {
cout
Если вспомнить как мы присваивали значения елементам масива то окажется что кроме проверки на размер больше ничево не нужно
Введи два разных массива, но первый элемент сделай одинаковый, получишь удивительный результат.
@@validdoll так вдруг элементы в массиве будут разные?
@@hub945 Он там просто про цикл for забыл, он был в ==, но почему-то он забыл его написать в !=. Бывает
Шикарно
Почему указатель на массив в классе MyClass вы инициализируете в области public?
есть ли разница как получать значения this->x или this->GetX и если есть то какая? Или без разницы, можно и так и так?
Спасибо за урок!
Возник еще такой вопрос: если я хочу сравнить три переменные класса Point, то как мне это сделать? Мне не даст так просто при такой реализации написать например
Point a(4, 2);
Point b(4, 2);
Point c(4, 3);
bool result;
result = a == b == c;
Если с присваиванием прописали return *this, то тут так не получится, ведь здесь у нас перегрузка типа bool
Мне кажется я чего-то недопонимаю...
@@Petr-kh1lt Да, хорошее решение, спасибо)
@@Petr-kh1lt Можно (a==b)==c
@@sergeyandreev8709 видимо чел не даёт бесплатных уроков направо и налево, удалил коммент xd
Я думаю что в операторе != нужно && поменять на ||.Разве не так?Просто если x =other.x , а y!=other.y то он скажет , что они равны хотя это не так
а ты гений оказывается
Именно так, в видосе ошибка!
А это работает при структурах(struct)???
да
@@СергейПетров-б1ф спасибо
по моему для перегрузок и конструкторов и диструкторов нужно делать шаблонные куски кода , чтобы быстро их подставлять?
питонячий вывод массива в консоль
operator string()
{
string arr = "[";
for (int i = 0; i < Size; i++)
arr += to_string(data[i]) + ", ";
if (Size == 0)
arr += "]";
else
arr += "\b\b]";
return arr;
}
а почему мы не можем воспользоваться геттерами, а берем значения напрямую?
спасибо
есть небольшое непонимание почему нельзя сделать вот так:
bool Point::operator!= (const Point& right)
{
return this->x != right.x && this->y != right.y;
}
при этом, оператор работает как логическое "или". но:
bool Point::operator!= (const Point& right)
{
return this->x != right.x || this->y != right.y;
}
работает как положено.
Кажется сам допер. Для решения без скобок и инвертирования всего выражения. Напишу, если кто задался вопросом: при сравнении одинаковых значений "Х" в левой части результат будет "0" и компилятор игнорирует правую часть, т.к. результат сравнения "0" с чем-либо даст "0", а поэтому необходимо проверять обе части выражения и использовать логическое "или" - "||".
подскажите пожалуйста у меня в первом случае выдает все время true , а во втором false с чем это может быть связано?
Почему в this попала переменная а, в others попала переменная b?
Наверное потому что изначально "a" сравнивается с "b"
a == b? / a.operator==(b);
Как вызывался бы и метод класса через обьект
Поэтому для объекта a вызывается перегруженный оператор и в this это будет "a", а в other - "b"
через cout
не нужно перегружать, нужно скобки поставить std::cout
у меня возвращает true при любых значениях x, y, так и не нашел в чем косяк( хехе нашел ошибку случайно через несколько видео, конструктор принимающий значения x, y был пустой просто)
в коде не равенства косяк в && и || ну и я бы написал так:
bool operator !=(const Point & other)
{
return this->x != other.x || this->y != other.y;
}
А можешь сказать,как исправить, пожалуйста ?
@@JTmartShturmannVideo нет косяка, есть такие законы логики - законы де Моргана. Один из них:
!(a&&b)==!(a) || !(b) (только здесь == это тождественное равенство(например число Пи тождественно равно 3,14...., не логическое)
У Сергея !(a&&b) , а у Вас !(a) || !(b) ;)
@@coldproducer Он даже написал где ошибка, если тебе этого мало, то может программирование не твоё? Или может ты много уроков пропустил?
А ты мог через SetX и SetY сделать, чтобы не заполнять конструктор
Чтобы Я без Вас делал ? . Спасибо
Для тех семерых ребят, что поставили дизлайки, заготовленно отдельное местечко в аду...
Спсб
А как сделать так с матрицей?
А можно в операторе "не равно" написать "return !(this==other)"?
Проверил, может кому пригодится)
Вот так вроде работает " return !(this->operator==(other)); "
@@iVAtcg а еще можно И заменить на ИЛИ.
А как сравнивать сразу 3 объекта (a==b==c)?
(a==b)==c или a==b && a==c
Перегрузка операторов < и >
#include
#include
using namespace std;
class Point {
public:
Point(int x, int y) {
this->x = x;
this->y = y;
}
string operator < (const Point& other) {
int thisVectrorLength = pow(this->x, 2) + pow(this->y, 2);
int otherVectrorLength = pow(other.x, 2) + pow(other.y, 2);
if (thisVectrorLength < otherVectrorLength) {
return "true";
}
else return "false";
}
string operator > (const Point& other) {
int thisVectrorLength = pow(this->x, 2) + pow(this->y, 2);
int otherVectrorLength = pow(other.x, 2) + pow(other.y, 2);
if (thisVectrorLength < otherVectrorLength) {
return "false";
}
else return "true";
}
private:
int x;
int y;
};
int main() {
Point a(1, 4);
Point b(0, 2);
string res = b < a;
string res2 = b > a;
cout
сравниваються по длинне вектора
в питоне это магические методы)
10/10
bool operator == (const Point& another) {
return (this->x == another.x) && (this->y == another.y);
}
bool operator != (const Point& another) {
return !(*this == another);
}
А почему это называется перегрузкой? Аналогии с перегрузкой конструктора или функций не вижу.
Случайно наткнулся на Вики на статью про перегрузку, в ней говорится, что это "калька" с англ. overload.
Т.е просто так перевели и используют.
почему никто не пишет что можно было просто вызвать обычное сравнения и потом инвертировать результат, в видео обычное нарушения D.R.Y. а вот метод более красив и понятен:
bool operator!=(const Point &other) { return !(*this == other); }
нарушение сухова, лол
а зачем здесь указатель?
@@sleepyNovember_project Ты разыменовываешь указатель и таким способом получаешь доступ к текущему объекту. Это то же самое, если бы была возможность писать this->object. Ты можешь получать доступ и к полям класса таким образом (*this).Size != other.Size вместо того, чтобы писать this->Size. Ну это так, для примера
@@illiahimself это всё понятно, но я не понял, зачем конкретно здесь разименование целого объекта, то есть значит именно сравнивается по соответствию всех значений полей в объекте или как?
@@sleepyNovember_project у тебя есть перегруженный оператор "==" и этим ретурном ты заходишь в этот оператор и возвращаешь обратный результат в перегруженный оператор "!=". В операции this == other у тебя сравниваются указатель и ссылка на объект и ты не можешь производить такое сравнение (типа указателя и типа объекта), поэтому чтобы получить доступ к объекту и произвести их сравнение тебе нужно разыменовать указатель. Ну и после этого ты заходишь в оператор "==" и там производится сравнение по тому, какую логику ты там заложил
up
Кто сможет решить эту задачу:21. Задача на взаимодействие между классами. Разработать систему «Интернет-магазин».
Товаровед добавляет информацию о Товаре. Клиент делает и оплачивает Заказ на Товары.
Товаровед регистрирует Продажу и может занести неплательщика в «черный список».
Если можно создать массив объектов,то проблем вообще никаких нет.
Сможете решить эту задачу?
@@Nurdastg да,но какой мне в этом интерес?Там нужно делать примерно это,но чуть сложнее:
MyClass arrMyClass[1]{};
int var = 1,i = 0;
arrMyClass[i].setValueA(var);
@@ИгорьДементьев-и7м если вам заплачу,не можете?
@@Nurdastg могу бесплатно,но без динамических массивов.Больно уж в лом мне с ними возиться.
кому мб нужен код для реализации для класса MyClass:
в private создаем int count = 0;
bool operator==(const MyClass& other)
{
if (this->Size == other.Size)
{
for (int i = 0; i < other.Size; i++)
{
if (this->data[i] == other.data[i])
count++;
}
}
return count > 0 ? true : false;
}
код покажется топорным, но он работает и я сам до него додумался ;)
Я конечно понял как это работает, но применение не совсем осознал
молодец, что как минимум понял, ведь ты расширил познания о программировании, и даже если это не понадобится тебе, то ты не зря потратил время. Н-р, на таких языках как C# такой проблемы нет, и ты будешь получить наслаждение от написания кода на нем, ведь ты знаешь, что как на самом деле это делать вручную. Понадобиться это может, если будешь делать какие-нибудь реальные проекты, грубо говоря, при обычном программировании я часто юзаю проверку на равенство переменных. Было бы странно, если бы данной нужды не было при использовании объектов).
return !((x1-x2) + (y1 - y2));
Хочу предостеречь тех, кто попытается так сделать. Сравниваем Point(5, -2) и Point(-2, 5):
x1 = 5, x2 = -2, y1 = -2, y2 = 5
!((5 - (-2)) + ((-2) - 5)) = !(7 + (-7)) = !(0) = true
Соответственно, Point(5, -2) = Point(-2, 5), что, очевидно, неверно. Все дело в том, что целочисленные операции не эквивалентны булевым.
Если же сильно хочется, то можно выполнить следующее преобразование (любопытствующим - гуглить "законы де Моргана"): NOT (A OR B) = (NOT A) AND (NOT B). Таким образом, получаем выражение !(x1 - x2) && !(y1 - y2). Здесь выражения !(...) примут значение true только тогда, когда в скобках будет 0, т.е. соответствующие координаты равны между собой. Значение же всего выражения станет true только тогда, когда оба выражения !(...) тоже будут true, т.е. тогда, когда x1 = x2 и y1 = y2
+
bool operator!=(const Point& other){
return !(*this == other);
}
с динамической памятью такое не прокатит
отсутствует оператор "==", соответствующий этим операндам
отсутствует оператор "==", соответствующий этим операндам
типы операндов: MyClass == MyClass
прошло 3 года, теперь смотрим новички :)
Страшна вырубай
поскольку я здесь хотелось бы передать
#include
using namespeace std;
int main()
{
cout
#include
using namespace std;
double max(double a,double b) {
if (a >= b) {
return a;
}
else { return b; }
}
class test
{
public:
test(int size){
this->Size = size;
this->data = new int[size];
for (int i = 0; i < size; i++)
{
data[i] = i;
}
cout data[i]) {
continue;
}
else {
return false;
}
}
return true;
}
~test() {
cout
Спасибо
Спасибо!
спасибо
Спасибо!