我知道这一点,因为这会将构造函数参数分配给类成员:
class A
{
public:
some_type B;
A(some_type B)
{
this->B = B;
}
}
但是这会做什么:
class A
{
public:
some_type B;
A(some_type B) : B(B)
{
}
}
这会将参数分配给自身或参数给类成员还是做其他事情?
构造之后列表中的名称(我不知道它的调用方式)是如何解决的?
答案 0 :(得分:9)
那件事在C ++中被称为成员初始化列表。
使用初始化程序列表初始化成员(第2个示例)并在构造函数体内为其赋值(第1个示例)之间存在差异。
通过初始化列表初始化字段时,构造函数将被调用一次。该对象使用传递的参数获得构造。
如果您使用分配,则首先使用默认构造函数初始化字段,然后使用实际值重新分配(通过赋值运算符)。
正如您所看到的,还有额外的创作和开销。后者中的赋值,对于用户定义的类可能是相当大的。
构造之后列表中的名称(我不知道它的调用方式)是如何解决的?
public:
some_type B;
A(some_type B) : B(B)
{
}
在上面的snipet中,有两个实体名为B
:
A
在A
的构造函数中作为参数接收的变量作为构造B
(通过调用其构造函数)的参数传递,该A
是类this->B(B);
的成员。这里的名称没有歧义,构造函数的全部是:
this
class A
是B()
指针。 B
是B
类型的构造函数。 B
是{{1}}类型的实例。 答案 1 :(得分:2)
这会将参数分配给自身还是将参数分配给类 会员还是做其他事情?
它会将参数分配给类成员。
构造之后列表中的名称如何(我不知道 它的召唤如何解决?
这是初始化列表,虽然该示例可能导致混淆,但括号左侧的id是类的成员,而括号内的id(或文字)只能是参数之一构造函数:想到这一点,根本就没有歧义。
这里的关键是这个列表必须初始化具有某些值的类成员,所以如果你想到
...: B(B)
在概念上等同于构造函数调用:
this->B(B)
......没有歧义。
答案 2 :(得分:0)
在第一种情况下,您的对象将被构建。在第二个中,它将被构造(使用默认构造函数)并分配。
您可能不希望分配(可能未定义运算符,或者没有默认构造函数或行为是特定的,或者在某些情况下可能是由于性能问题)。
关于可见性,在这两种情况下,如果你只使用B,它就是你操纵的参数。