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

3

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

#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 的对象 first、second 和 third。我们在声明时对它们进行了初始化。冒号后面发生了什么?整体上又是怎样的情况呢?


你应该在这里明确指定编程语言...最好是在标签和标题中。即便如此,这可能不是最好的问题... - Zach Lysobey
抱歉,下次会注意。按下提交按钮后才意识到这个问题。 - user1478983
4
构造函数初始化列表是C++语言的一个基本特性。这是你在喜爱的C++书籍中读到的内容。 - AnT stands with Russia
谢谢。我不知道这个主题的名称,或者具体该搜索什么。更新标题以便将来有人可以搜索到它。 - user1478983
4个回答

3

这一行代码到底在干什么:

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

这是一个构造函数,它带有三个参数和默认值。

这部分 : i(第一个参数), f(第二个参数), c(第三个参数) 被称为 成员初始化列表。成员初始化列表由逗号分隔的初始化程序列表组成,其前面带有冒号。它放置在参数列表的右括号后面,在函数体的左大括号之前。

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


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的本地对象初始化为构造函数中列出的默认值。


2

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

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


这是否等同于说:如果我们声明一个类型为X的对象Y,则Y.first将具有默认值1,Y.second将具有默认值2.0,Y.third将具有默认值a。在冒号后面,i被赋予默认值1,f=2.0,c=a。因此,在这种情况下,i(1)表示i = 1吗? - user1478983
什么意思?我觉得你的消息被截断了。 - RonaldBarzell
是的,那是正确的。同时请记住,任何类型的函数都可以使用参数的默认值(例如:first=1等)。 - RonaldBarzell

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

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

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

参数后的部分

: i(first) , f(second) , c(third)

ifc成员的初始化器。如果可能,优先使用这种初始化方式,而不是在函数体中初始化。如果成员是常量类型,则必须使用此样式。

然后构造函数有一个空的体{}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接