C++ C++;实例化";隐式;类对象

C++ C++;实例化";隐式;类对象,c++,object,constructor,instantiation,objectinstantiation,C++,Object,Constructor,Instantiation,Objectinstantiation,一致 Cents(4)+6 进行了评估。 是的,我知道我们分别为仙和int类型的操作数重载运算符“+” 据我所知,Censt(4)是构造函数,对吗?那么什么时候 Cents c1 = Cents(4) + 6; 被称为cCenst是否成为对美分(4)的引用 排队 Cents operator+(const Cents &cCents, int nCents) { return Cents(cCents.m_nCents + nCents); } 我们可以推断cCenst是一

一致

Cents(4)+6 
进行了评估。 是的,我知道我们分别为仙和int类型的操作数重载运算符“+”

据我所知,Censt(4)是构造函数,对吗?那么什么时候

Cents c1 = Cents(4) + 6;
被称为cCenst是否成为对美分(4)的引用

排队

Cents operator+(const Cents &cCents, int nCents)
 {
 return Cents(cCents.m_nCents + nCents);
 }
我们可以推断cCenst是一个类型为Censt的对象,因为我们通过成员选择运算符“.”访问m\u nCents,但Censt(4)是一个构造函数,而不是类对象


对我来说,将cCenst作为对美分(4)的引用似乎没有意义,因为它们不是等价的。

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

据我所知,Censt(4)是构造函数,对吗

不完全是。您永远不会直接调用构造函数,即使这种语法让它看起来有点像您

在这里,您正在使用构造函数参数
4
构造一个类型为
Censt
的临时变量

你可以这样想:

return Cents(cCents.m_nCents + nCents);
这不是一个函数调用

cCenst是否成为对美分(4)的引用

但是Censt(4)是一个构造函数而不是类对象

再说一遍,不是。它是一个物体

据我所知,Censt(4)是构造函数,对吗

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

那么,当调用[…]时,cCenst是否成为对美分(4)的引用

它成为对计算
Cents(4)
子表达式时创建的对象的引用

行返回美分(cCents.m_nCents+nCents)可以推断cCenst是类型为Censt的对象,因为我们通过成员选择运算符“访问m\n个元素”

cCents
属于
const Cents&
类型,因为它是这样声明的

但是Censt(4)是一个构造函数而不是类对象

Cents(4)
是一个表达式。它不是构造函数。详细说明:它是一个表达式,需要调用构造函数进行求值,并生成一个
Cents
对象

在表达式中:

Cents c1=Cents(4)+6

首先计算子表达式(根据运算符优先级等)。因此,
Cents(4)
被计算并成为
Cents
对象。然后,可将整体表达式视为:

Cents c1=+6


next通过调用定义的
+
运算符来计算
+6
部件。在该运算符方法中, Cuths< /Case>参数成为对代码> > /Cord>的引用。

您应该减少这里的标签数量,并将C++标签应用到您的问题(如果这是C++)。我不知道这个问题与操作符重载有关。为什么你不能把它放在与某个任意函数相关的位置,例如使用函数是
foo(Cents(4))
?是的,我必须承认我的例子与操作符重载没有什么关系,而是通过引用将类对象传递给函数。然而,我不会编辑代码并删除运算符重载的内容,因为我无法给出一个有意义的示例。但是考虑到你明智的评论,我将更改问题的标题。@MaxGreen:谢谢;现在好多了。不,构造函数不会“返回”任何东西。是的,你说得对,这不是我要写的词。我改了。构造函数也不“创建对象”。至少,不是全部。他们初始化数据成员。内存分配和其他内容由语言单独处理。这就是为什么这不是“调用构造函数”;实际上,构造函数甚至没有名称(12.1/1)!既然您告诉我美分(4)创建了一个未命名的对象,我就理解了函数参数“cCenst”是如何引用它的。谢谢)@MaxGreen:没问题:)更准确地说,
Cents(4)
是一个右值表达式。正如
4
是一个右值一样。@KubaOber:从抽象的角度来看,它是一个对象。两个层次的抽象,它是源代码文件中的字符序列。精确是很好的,但是语境就是一切。我只是认为把这个词带到讨论中是有用的,因为很难谈论大多数现代C++而不需要区分。我并不是说你不提这件事就犯了大错:)
return Cents(cCents.m_nCents + nCents);
Censt x(4);  // creates a `Censt` with name `x` from argument `4`
Censt(4);    // creates a `Censt` with no name from argument `4`