构造 函数?或者别的什么

Constructor? or something else?

本文关键字:什么 或者 函数 构造      更新时间:2023-10-16

可能的重复项:
构造函数中这种奇怪的冒号成员语法是什么?

所以我正在浏览 Direct X 10 书中的一些样本,当我遇到这个时

PeaksAndValleys::PeaksAndValleys()
: mNumRows(0), mNumCols(0), mNumVertices(0), mNumFaces(0),
  md3dDevice(0), mVB(0), mIB(0)
{
}

我知道这可能应该是一个构造函数......但我从未见过这样的人?有人可以解释一下吗?具体来说,为什么在声明之后会有单曲:?

构造函数初始化列表

称为初始化列表,用于初始化类成员。它既作为简写也很有用,并且是初始化没有默认构造函数的成员所必需的。例如:

#include <iostream>
using namespace std;
class Foo {
public:
    Foo(int x) { cout << "Foo(" << x << ")" << endl; }
};
class Bar : public Foo {
    Foo member;
public:
    Bar() { /* error */ }
};

这会产生错误,因为member不能默认构造,因为Foo没有默认构造函数。将其更改为

Bar(): member(42) {}

现在它起作用了。

此语法对于初始化类的const成员也很有用,因为虽然它们可能是默认可构造的,但不能在构造函数主体中覆盖它们。

class Baz {
    const member;
public:
    Baz(int x): member(x) {}
};

同样的想法也适用于引用,因为它们也必须直接初始化。最后,它用于指定基类构造函数的参数。

class Xyzzy : public Foo {
public:
    Xyzzy(int y): Foo(y+3) {}
};

这只是设置类字段的语法。在大多数情况下,它在功能上与您期望的版本相同,其中每个字段都在构造函数主体中设置。它允许您将参数传递给构造函数,否则您可能无法这样做。但是,在某些其他情况下,您需要此语法(分配成员引用等)。有时还会看到构造函数链接,其中以相同的方式调用基类构造函数,而不仅仅是设置成员变量。

class Base { 
public:
    Base(int n) {}
};
class Derived : public Base {
public:
    Derived(int n) : Base(n) {}
};

它称为构造函数初始值设定项。

ClassName::ClassName(Type someArgument) : memberName(initialValue),
    otherMember(someArgument)
{
    //constructor logic
}

它将memberName设置为 initialValueotherMember设置为 someArgument 。几个成员之间用一个,分隔。

我只想补充:

只要有可能,你就会!它比使用经典方法要快得多。您可以使用它来初始化常量、成员、调用父构造函数等。

您在此列表中指定的所有内容都将在创建类实例之前创建!

:语法允许您为类成员的构造函数指定参数。

例如,此类具有一个名为 md3dDevice 的成员,其构造函数将整数(或指针)作为参数。使用 : 运算符,可以设置该构造函数的参数。