C++ C++;具有声明帐户的构造函数(int=0);

C++ C++;具有声明帐户的构造函数(int=0);,c++,C++,构造函数行为的行的含义是什么(int=0);需要int=0在这里所能做的。解释 class Act { protected: string Owner; double Balance; public: explicit Act(int = 0); double getBalance() { return Balance; }; }; 定义一个构造函数,该构造函数从int参数构造Act。=0表示如果可以省略该参数,则其默认值为0。explicit关键字告诉

构造函数行为的行的含义是什么(int=0);需要int=0在这里所能做的。

解释

class Act {

protected:

    string Owner;

    double Balance;
public:
    explicit Act(int = 0);

    double getBalance() { return Balance; };
};
定义一个构造函数,该构造函数从
int
参数构造
Act
=0
表示如果可以省略该参数,则其默认值为0。explicit关键字告诉编译器不要使用此构造函数进行隐式转换

使用示例

事实上:

explicit Act (int = 0);  
如果没有显式关键字,那么这行就可以了

Act a1;           // Will generate the same code as Act a1(0);
Act a5{};         // Same as above, but using the braced initialization 
Act a2(12);       // Obvious 
Act a3=13;        // Ouch ! Compiler error because of explicit 
Act a4 = Act(13); // Ok, because now the call is explicit
重要评论

默认值不是构造函数本身的一部分,而是调用方根据调用方已知的构造函数声明定义的行为

这意味着您可以在不同的编译单元中包含具有不同默认值的类声明。虽然奇怪,但这是完全正确的

请注意,声明中没有参数名称也不是问题,因为可以在构造函数定义中声明参数名称:

Act a3=13;        // If not explicit, this is the same than Act a3=Act(13);

为了回答你的问题,我们必须把这条线的功能分解


该行调用类
Act
的构造函数,没有变量名的int要求构造函数取一个int。但是
=0
部分是默认参数,告诉构造函数不需要int,只要在那里放一个0即可。

这是默认值。如果不将值传递给构造函数,它将接收值
0
。它使类型
int
的第一个参数具有默认值
0
。因此,您可以创建
Act object
,而无需指定参数的值。如果声明参数有助于记录参数,则仅命名该参数。如果它是显式行为(所有者常数&)我不会输入“dummy”参数名,但如果它是
显式Act(string const&owner)acta3=13
并不等同于
acta3=Act(13)
。对于非显式构造函数,它相当于
acta3(13)
@Peter Standard在17.6.2中说的“转换”调用所选函数时,将使用初始值设定项表达式作为其参数;如果该函数是构造函数,则该调用将初始化目标类型的cv非限定版本的临时值。该临时值是prvalue。调用的结果(对于构造函数来说是临时的)然后用于根据上述规则直接初始化作为复制初始化目标的对象”。我将其理解为
Act a3(Act(13))
,这与
Act a3=Act(13)
@Peter相同。标准继续重新定义可能发生的副本省略:“在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除这种直接初始化中固有的复制;“-此规则将
Act a3(Act(13))
转换为
Act a3(13)
。因此最终结果是相同的。我只是应用了这些规则,没有抄近路的复制省略。@Peter关于案例(f)的附加信息。请注意,只有当x已经是类型A(复制构造)时,A=x才与A(x)相同。”-很抱歉重复的消息,但是注释的最大长度对于详细的解释来说太短了:-)自从C++17以来,所有三种形式都有相同的语义(唯一的区别是
explicit
阻止其中一种进行编译)。在任何情况下都不再涉及临时注释
Act::Act(int x) : Balance((double)x) {
    cout <<"Constructor Act with parameter "<<x<<endl;
}
Act a0();   // Ouch !! function declaration ! Use a0 or a0{} instead.