构造函数?或者是其他东西?

时间:2011-05-09 14:56:12

标签: c++ directx

  

可能重复:
  What is this weird colon-member syntax in the constructor?

所以当我遇到这个

时,我正在查看Direct X 10书中的一些样本
PeaksAndValleys::PeaksAndValleys()
: mNumRows(0), mNumCols(0), mNumVertices(0), mNumFaces(0),
  md3dDevice(0), mVB(0), mIB(0)
{
}

我明白这可能应该是一个构造函数......但我从来没有见过像这样的人?谁能解释一下?具体为什么有一个单一的:声明之后?

6 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

这称为初始化列表,用于初始化类成员。它既可以作为简写,也可以初始化没有默认构造函数的成员。例如:

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

它被称为构造函数初始化程序。

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

它将memberName设置为initialValue,将otherMember设置为someArgument。有几个成员被,隔开。

答案 4 :(得分:1)

我只想补充一下:

随时随地都可以!使用经典方法要快得多。您可以使用它来初始化常量,成员,调用父构造函数等。

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

答案 5 :(得分:0)

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

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