1
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) 似乎没有意义,因为它们并不等同。

4

3 回答 3

3

据我了解 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) 是一个构造函数,而不是一个类对象。

再次,不。它一个对象。

于 2015-02-07T18:31:04.753 回答
1

据我了解 Censt(4) 是构造函数,对吗?

Cents(4)是一个创建Cents对象的表达式(导致调用构造函数)。计算表达式的结果就是这样创建的对象。

那么当 [...] 被调用时,cCenst 是否会成为对 Cents(4) 的引用?

Cents(4)它成为对在评估子表达式时创建的对象的引用。

从这一行return Cents(cCents.m_nCents + nCents);可以推断出 cCenst 是 Censt 类型的对象,因为我们通过成员选择运算符“。”访问 m_nCents。

cCents是 type 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>

于 2015-02-07T18:42:56.603 回答
0

构造函数将创建对象,因此在您获得一个对象和一个 int 之后,它将获取该对象。它不完全是一个引用,它是一个 const 引用,因此您不需要之前创建它,因为无法修改对象。

于 2015-02-07T18:00:31.383 回答