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)的引用似乎没有意义,因为它们并不等同。
答案 0 :(得分:2)
据我所知,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)是构造函数而不是类对象。
再一次,没有。它是一个对象。
答案 1 :(得分:1)
据我所知,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>
的引用。
答案 2 :(得分:0)
构造函数将创建对象,因此在获得对象和int之后它将获取该对象。 它不是一个引用,它是一个const引用,因此您不需要先创建它,因为该对象无法修改。