可能重复:
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)
{
}
我明白这可能应该是一个构造函数......但我从来没有见过像这样的人?谁能解释一下?具体为什么有一个单一的:声明之后?
答案 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
的成员,其构造函数将整数(或可能是指针)作为参数。使用:
运算符可以设置构造函数的参数。