C ++ Instantiating & quot; Неявное & quot; Объект класса

class Cents
{
private:
int m_nCents;

public:
Cents(int nCents) { m_nCents = nCents; }

// Overload cCents + int
friend Cents operator+(const Cents &cCents, int nCents);
int GetCents() { return m_nCents; }
};

// note: this function is not a member function!
Cents operator+(const Cents &cCents, int nCents)
{
return Cents(cCents.m_nCents + nCents);
}

int main()
{
Cents c1 = Cents(4) + 6;
std::cout << "I have " << c1.GetCents() << " cents." << std::endl;

return 0;
}

Мне непонятно как выражение

Cents(4)+6

в соответствии

Cents c1 = Cents(4) + 6;

оценивается.
Да, я знаю, что мы перегружаем оператор «+» для операндов типов Cents и int соответственно.

Как я понимаю, Censt (4) является конструктором, верно? Так когда

Cents operator+(const Cents &cCents, int nCents)
{
return Cents(cCents.m_nCents + nCents);
}

называется ли cCenst ссылкой на Cents (4)?

С линии

return Cents(cCents.m_nCents + nCents);

Можно сделать вывод, что cCenst является объектом типа Censt, поскольку мы обращаемся к m_nCents через оператор выбора члена «.» Но Censt (4) является конструктором, а не объектом класса.

Мне кажется, что cCenst не имеет смысла ссылаться на Cents (4), поскольку они не эквивалентны.

1

Решение

Как я понимаю, Censt (4) является конструктором, верно?

Нет не совсем Вы никогда Вызовите конструктор напрямую, даже если этот синтаксис делает его похожим на ваш.

Здесь вы создаете временный тип Censt с аргументом конструктора 4,

Думайте об этом больше как это:

Censt x(4);  // creates a `Censt` with name `x` from argument `4`
Censt(4);    // creates a `Censt` with no name from argument `4`

Это не вызов функции.

cCenst становится ссылкой на Cents (4)?

Да.

Но Censt (4) является конструктором, а не объектом класса.

Опять нет. Это является объект.

2

Другие решения

Как я понимаю, Censt (4) является конструктором, верно?

Cents(4) это выражение, которое создает Cents объект (что приводит к вызову конструктора). Результатом вычисления выражения является созданный таким образом объект.

Итак, когда вызывается […], становится ли cCenst ссылкой на Cents (4)?

Это становится ссылкой на объект, который был создан, когда Cents(4) подвыражение было оценено.

С линии return Cents(cCents.m_nCents + nCents); Можно сделать вывод, что cCenst является объектом типа Censt, поскольку мы обращаемся к m_nCents через оператор выбора члена «.»

cCents имеет тип const Cents &потому что так заявлено.

Но Censt (4) является конструктором, а не объектом класса.

Cents(4) это выражение. Это не конструктор. Чтобы уточнить: это выражение, которое требует вызова конструктора для оценки, и которое приводит к Cents объект.

В выражении:

Cents c1 = Cents(4) + 6;

Подвыражения оцениваются первыми (в соответствии с приоритетом оператора и т. Д.). Так, Cents(4) оценивается и становится Cents объект. Общее выражение может тогда рассматриваться как:

Cents c1 = <a-newly-created-Cents-object> + 6;

<a-newly-created-Cents-object> + 6 часть оценивается следующим, вызывая определенный + оператор. В этом методе оператора cCents параметр становится ссылкой на <a-newly-created-Cents-object>,

1

конструктор создаст объект, поэтому после того, как вы получите объект и int, он возьмет объект.
Это не совсем ссылка, это константная ссылка, поэтому вам не нужно создавать ее раньше, потому что объект нельзя изменить.

0
По вопросам рекламы [email protected]