В чем разница между этими двумя фрагментами кода, когда мы выполняем перегрузку операторов?

Код 1:

class CVector {
public:
    int x, y;
    CVector() {};
    CVector(int a, int b) :x(a), y(b) {}
};

CVector operator- (const CVector& lhs, const CVector& rhs)
{
    CVector temp;
    temp.x = lhs.x - rhs.x;
    temp.y = lhs.y - rhs.y;
    return temp;
}

int main()
{
    CVector foo(2, 3);
    CVector bar(3, 2);
    CVector result;
    result = foo - bar;
    cout << result.x << ',' << result.y << endl;
}

Код 2:

class CVector {
public:
    int x, y;
    CVector() {};
    CVector(int a, int b) :x(a), y(b) {}
};

CVector operator- (const CVector& lhs, const CVector& rhs)
{
    return CVector(lhs.x - rhs.x, lhs.y - rhs.y);
}

int main()
{
    CVector foo(2, 3);
    CVector bar(3, 2);
    CVector result;
    result = foo - bar;
    cout << result.x << ',' << result.y << endl;
}

Эти две части кода работают одинаково. Я хочу знать, почему мы можем писать CVector(lhs.x - rhs.x, lhs.y - rhs.y). Что это означает? Что происходит, когда мы используем класс без имени?

Второй фрагмент использует параметризованный конструктор в операторе возврата return CVector(lhs.x - rhs.x, lhs.y - rhs.y)

Anoop Rana 09.04.2022 18:10

Для абсолютного полный ответ см. youtube.com/watch?v=7DTlWPgX6zs .

Sneftel 09.04.2022 18:10

ничем не отличается от любого другого типа. Есть ли разница между: int a = 3; return a; и return 3;?

Adrian Mole 09.04.2022 18:15

Спасибо за комментарии! Все были полезны.

심민기 09.04.2022 18:46
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

why we can write CVector(lhs.x - rhs.x, lhs.y - rhs.y). What does it mean? What happens when we use a class without a name?

Выражение CVector(lhs.x - rhs.x, lhs.y - rhs.y) использует параметризованный конструкторCVector::CVector(int, int) для создания CVector путем передачи аргументов lhs.x - rhs.x и lhs.y - rhs.y. Точно так же, как CVector foo(2, 3); и CVector bar(3, 2) используют параметризованный конструктор, выражение CVector(lhs.x - rhs.x, lhs.y - rhs.y) также использует параметризованный ctor.

Вы можете подтвердить это, добавив cout внутри параметризованного конструктора, как показано ниже:

#include <iostream>

class CVector {
public:
    int x, y;
    CVector() {};
    CVector(int a, int b) :x(a), y(b) {
        std::cout<<"paremterized ctor used"<<std::endl;
        }
};

CVector operator- (const CVector& lhs, const CVector& rhs)
{
    return CVector(lhs.x - rhs.x, lhs.y - rhs.y); //this uses the parameterized ctor
}

int main()
{
    CVector foo(2, 3);
    CVector bar(3, 2);
    CVector result;
    result = foo - bar;
    std::cout << result.x << ',' << result.y << std::endl;
}

выход вышеуказанной программы:

paremterized ctor used
paremterized ctor used
paremterized ctor used
-1,1

Обратите внимание, что в показанном выше выводе третий вызов параметризованного ctor связан с оператором return return CVector(lhs.x - rhs.x, lhs.y - rhs.y);

Итак, если я пишу как целочисленный тип, равен ли CVector(lhs.x-rhs.x, lhs.y-rhs.y) int (10)? просто например.

심민기 09.04.2022 18:24

Именно так. интервал (3); интервал (3); CВектор А(3,4); CВектор (3,4);

심민기 09.04.2022 18:25

@심민기 Например, CVector(3,4), CVector(10,1), CVector(1,1) все используют параметризованный ctor. Все они создают объект типа CVector, используя параметризованный ctor. Точно так же внутри функции main оператор CVector foo(2, 3); создает объект типа CVector с именем foo, передавая аргументы 2 и 3 в параметризованный ctor.

Anoop Rana 09.04.2022 18:28

Спасибо за подробное объяснение. У меня есть еще два вопроса: является ли CVector(3,4) временным объектом, который не имеет имени и имеет только значения x и y? Делает ли CVector a = CVector(3,4) a.x=3 и a.y=4?

심민기 09.04.2022 18:35

@심민기 CVector(3,4); создает временный объект безымянный, который будет уничтожен в конце полного выражения. С другой стороны, CVector foo(3,4); создает объект названный, который будет уничтожен, когда выйдет за пределы области видимости.

Anoop Rana 09.04.2022 18:37

Так означает ли CVector a = CVector(3,4) выделение каждого значения переменных-членов CVector(3,4) в a?

심민기 09.04.2022 18:39

@심민기 CVector a = CVector(3,4); — это копирование-инициализация и использует конструктор копирования. Здесь a будет уничтожен, когда выйдет за рамки.

Anoop Rana 09.04.2022 18:41

Другие вопросы по теме