快速C ++类混淆:这行是什么意思?

时间:2012-04-21 04:46:57

标签: c++ class

我正在将一些C ++移植到Java,并遇到了以下简写..但不知道这意味着什么,甚至不知道如何使用Google搜索:

class mailbox {
public:
 mailbox(): sent(0),received(0),msg(0) { }

我不明白该方法在mailbox()表示后调用(?)的内容。

感谢。

2 个答案:

答案 0 :(得分:2)

这是成员初始化语法。它将数据成员初始化为构造函数体开始之前指定的值。

这是在C ++ 11之前初始化非静态常量数据成员的唯一方法,并且比在构造函数体中初始化更快。

就像

mailbox() {
    sent = 0;
    received = 0;
    msg = 0;
}

除了更快,它也可以在const成员上执行。实际上,虽然它不提供对数据成员执行检查的能力,但您仍然可以使用它:

mailbox (Foo sent, Bar received, Foobar msg) : sent (0), received (0), msg (0) { //default values
    if (!setSent (sent)) 
        cout << "Error setting sent; sent is 0 instead."; //since we initialized it to 0 before
    //likewise for other members...
}

答案 1 :(得分:1)

假设发送,接收和消息是int,则相当于:

mailbox() {
    sent = 0;
    received = 0;
    msg = 0;
}

这种语法的存在是因为,与所有对象都是指针的Java不同,在C ++中,您可以拥有其类型没有默认构造函数的成员变量。例如:

class Foo {
public:
    Foo(int x);
};

class Bar {
public:
    Bar(int x) { // ERROR, Foo does not have a default constructor
        foo = Foo(x);
    }

    Bar() : Foo(0) {} // OK, using Foo(int) instead of Foo()

private:
    Foo foo;
};

请注意,在示例中,即使Foo具有默认构造函数,Bar(int)也会构造Foo两次。