C ++:Classes&构造函数:使用初始化列表初始化字段

时间:2012-11-28 21:35:09

标签: c++ constructor initialization

完整代码。稍后指定的行。

#include <iostream>
#include <string>

using namespace std;

class X
{
    private:

    int i;
    float f;
    char c;

    public:

    X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { } 
    void print() { cout << i << " " << f << " " << c << endl;}

};


int main()
{
    X var1;
    var1.print();

    return 0;
}

这一行究竟发生了什么:

X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { }

据我所知(可能是错误的),我们声明对象(类)X的第一,第二和第三对象。我们在声明期间初始化它们。结肠后发生了什么?发生了什么事?

4 个答案:

答案 0 :(得分:3)

这一行究竟发生了什么:

X(int first=1, float second=2.0, char third='a') 
: i(first) , f(second) , c(third) { 
}

它是一个构造函数,它使用默认值获取3个参数。

此部分: i(first) , f(second) , c(third)称为member initializer list。成员初始化列表包含 逗号分隔的初始化列表,以冒号开头。它是在收盘后放置的 参数列表的括号和函数体的左括号之前。

只有构造函数可以使用此初始化列表语法。 const类成员必须在成员初始化器中初始化。

答案 1 :(得分:2)

括号中的内容是构造函数参数的默认值,冒号后冒号在冒号后初始化这些项。

冒号表示法最常用于调用类使用的其他对象的构造函数。

答案 2 :(得分:2)

你的X级有三个字段:i,f,c。 您已经定义了一个具有三个默认参数的构造函数 - 当此构造函数调用的字段使用参数初始化时(传递给构造函数或默认值)。 就像:

X (int first=1, float second=2.0, char third='a')
{
   i = first;
   f = second;
   c = third;
}

你的行只是初始化字段的另一种方式,通常它们是相同的(与继承有一些区别)。

在主代码中,您正在创建X类型的局部变量var1,因此调用构造函数。您没有传递任何参数,因此使用默认值。

结果,您使用构造函数中列出的默认值初始化了类型X的一个本地对象。

答案 3 :(得分:1)

X(int first=1, float second=2.0, char third='a') : i(first) , f(second) , c(third) { }

这是X的构造函数。有三个agruments,每个都有一个默认值,因此可以用不同的方式调用它

X myX;
X myX(first);
X myX(first, second);
X myX(first, second, third);

参数

之后的部分
: i(first) , f(second) , c(third)

ifc成员的初始值设定项。如果可能,这种初始化方式优于函数体中的初始化,如果成员是常量类型,则需要此样式。

然后构造函数{}

有一个空体