构造 函数?或者别的什么
Constructor? or something else?
可能的重复项:
构造函数中这种奇怪的冒号成员语法是什么?
所以我正在浏览 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
设置为 initialValue
,otherMember
设置为 someArgument
。几个成员之间用一个,
分隔。
我只想补充:
只要有可能,你就会!它比使用经典方法要快得多。您可以使用它来初始化常量、成员、调用父构造函数等。
您在此列表中指定的所有内容都将在创建类实例之前创建!
:
语法允许您为类成员的构造函数指定参数。
例如,此类具有一个名为 md3dDevice
的成员,其构造函数将整数(或指针)作为参数。使用 :
运算符,可以设置该构造函数的参数。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 计时器坏了或者其他什么的
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- vector::empty()出错,或者我遗漏了什么
- 继承Java集合接口(Set、Map、List等)的C++等价物是什么?或者扩展AbstractCollection
- ShellExecute不工作,或者我做错了什么
- 我的字节数组到十六进制字符串转换器有什么问题,或者为什么它在写入文件时会在某个位置后剪切符号?
- 我可以将 std::数组转换为切片吗?或者我还能用什么
- valarray在gcc和msvc(或者Linux和Windows)中有什么不同
- 我的iOS金属计算内核是否存在编译器错误,或者我遗漏了什么
- 如何派生模板函数?或者这个场景的首选方法是什么
- 有什么事情c++可以做得比D更好,或者D做不到的吗?(多重继承的例子)
- 解析是如何工作的,或者是什么使类型完整或不完整
- 构造 函数?或者别的什么
- 为什么 std::noskipws 不起作用,或者它应该做什么?