考虑这种构造:Packet() : bits_(0), datalen_(0), next_(0) {}
C++构造了解
注意bits_
,datalen_
和next_
在类分组字段定义如下:
u_char* bits_;
u_int datalen_;
Packet* next_;
是什么构造,这部分是什么意思? bits_(0), datalen_(0), next_(0)
考虑这种构造:Packet() : bits_(0), datalen_(0), next_(0) {}
C++构造了解
注意bits_
,datalen_
和next_
在类分组字段定义如下:
u_char* bits_;
u_int datalen_;
Packet* next_;
是什么构造,这部分是什么意思? bits_(0), datalen_(0), next_(0)
这是一个初始化列表,它将值设置为指定的值。
Packet() : bits_(0), datalen_(0), next_(0)
{
assert(bits_ == 0);
assert(datalen_ == 0);
assert(next_ == 0);
}
//...
Packet()
{
//bits_ , datalen_, next_ uninitialized here
}
一些成员(const
会员或用户定义的类成员没有默认构造函数)不能在初始化列表之外进行初始化:
class A
{
const int x;
A() { x = 0; } //illegal
};
class A
{
const int x;
A() : x(0) { } //legal
};
另外值得一提的是,双初始化不会使用这种技术发生:
class B
{
public:
B() { cout << "default "; }
B(int) { cout << "b"; }
};
class A
{
B b;
A() { b = B(1); } // b is initialized twice - output "default b"
A() : b(1) { } // b initialized only once - output "b"
};
这是初始化成员的优先方式。
它被称为初始值设定项列表,它使用括号中指定的值初始化字段。下面将达到同样的效果到底:
Packet()
{
bits_ = nullptr; // or 0 or NULL pre-C++11
datalen_ = 0;
next_ = nullptr;
}
不同的是,在我的例子中,你正在做分配,领域就已经被他们的默认构造函数来构建。
对于没有默认构造函数的用户定义类型,初始化程序列表是唯一的方法,因为您需要为构造函数提供一些参数。
在他的特殊情况下,是的,但对于用户定义的数据成员,它是完全不同的,可能想指出。 – 2012-04-05 11:19:40
@LuchianGrigore完成。 – jrok 2012-04-05 11:23:11
这意味着第一bits_,然后datalen_最后next_将收到的0即值下面2个代码片段是完全等效的:
Packet()
: bits_(0)
, datalen_0)
, next_(0)
{
}
和此:
Packet()
{
bits_ = 0;
datalen_ = 0;
next_ = 0;
}
当心,虽然。初始化顺序由成员声明顺序决定。即因为本来预计有下面的代码将无法正常工作:
struct Packet
{
int first;
int second;
Packet()
: second(0)
, first(second)
{
}
};
这将是相同的:
struct Packet
{
int first;
int second;
Packet()
{
first = second;
second = 0;
}
};
所以第二将获得0,但第一不会
雅我猜测一样 - 但我想知道做这件事的技术名称,以便我可以阅读更多关于它。谢谢:) – vigs1990 2012-04-05 11:18:00
初始化列表。 – 2012-04-05 11:20:30
@Luchian Grigore什么是双重初始化? – vigs1990 2012-04-05 11:21:58