完整代码。稍后指定的行。
#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的第一,第二和第三对象。我们在声明期间初始化它们。结肠后发生了什么?发生了什么事?
答案 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)
是i
,f
和c
成员的初始值设定项。如果可能,这种初始化方式优于函数体中的初始化,如果成员是常量类型,则需要此样式。
然后构造函数{}