C ++ Instantiating" Implicit"类对象

时间:2015-02-07 17:52:28

标签: c++ object constructor instantiation objectinstantiation

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

3 个答案:

答案 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引用,因此您不需要先创建它,因为该对象无法修改。