在构造函数中使用类成员名称

时间:2011-09-13 15:10:27

标签: c++ constructor

我知道这一点,因为这会将构造函数参数分配给类成员:

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)
        {
        }
}

这会将参数分配给自身或参数给类成员还是做其他事情?
构造之后列表中的名称(我不知道它的调用方式)是如何解决的?

3 个答案:

答案 0 :(得分:9)

那件事在C ++中被称为成员初始化列表

使用初始化程序列表初始化成员(第2个示例)并在构造函数体内为其赋值(第1个示例)之间存在差异。

通过初始化列表初始化字段时,构造函数将被调用一次。该对象使用传递的参数获得构造

如果您使用分配,则首先使用默认构造函数初始化字段,然后使用实际值重新分配(通过赋值运算符)。

正如您所看到的,还有额外的创作和开销。后者中的赋值,对于用户定义的类可能是相当大的。


构造之后列表中的名称(我不知道它的调用方式)是如何解决的?

public:
    some_type B;
    A(some_type B) : B(B)
    {
    }

在上面的snipet中,有两个实体名为B

  1. 首先是构造函数作为参数接收的那个&
  2. 其次是班级A
  3. 的成员

    A的构造函数中作为参数接收的变量作为构造B(通过调用其构造函数)的参数传递,该A是类this->B(B); 的成员。这里的名称没有歧义,构造函数的全部是:

    this
    1. class AB()指针。
    2. BB类型的构造函数。
    3. 括号内的
    4. B是{{1}}类型的实例。

答案 1 :(得分:2)

  

这会将参数分配给自身还是将参数分配给类   会员还是做其他事情?

它会将参数分配给类成员。

  

构造之后列表中的名称如何(我不知道   它的召唤如何解决?

这是初始化列表,虽然该示例可能导致混淆,但括号左侧的id是类的成员,而括号内的id(或文字)只能是参数之一构造函数:想到这一点,根本就没有歧义。

这里的关键是这个列表必须初始化具有某些值的类成员,所以如果你想到

...: B(B)

在概念上等同于构造函数调用:

this->B(B)

......没有歧义。

答案 2 :(得分:0)

在第一种情况下,您的对象将被构建。在第二个中,它将被构造(使用默认构造函数)并分配。

您可能不希望分配(可能未定义运算符,或者没有默认构造函数或行为是特定的,或者在某些情况下可能是由于性能问题)。

关于可见性,在这两种情况下,如果你只使用B,它就是你操纵的参数。