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), поскольку они не эквивалентны.
Как я понимаю, 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) является конструктором, а не объектом класса.
Опять нет. Это является объект.
Как я понимаю, 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>
,
конструктор создаст объект, поэтому после того, как вы получите объект и int, он возьмет объект.
Это не совсем ссылка, это константная ссылка, поэтому вам не нужно создавать ее раньше, потому что объект нельзя изменить.