这个结构试图做什么?

问题描述:

在下面C++代码:这个结构试图做什么?

struct Features { 
    int F1; 
    int F2; 
    int F3; 
    int F4; 
    Features(int F1,int F2,int F3,int F4) 
    : F1(F1), F2(F2), F3(F3), F4(F4) { } 
}; 

是什么意思一部分?

Features(int F1,int F2,int F3,int F4) 
     : F1(F1), F2(F2), F3(F3), F4(F4) { } 

谢谢。

它正在初始化使用构造函数的初始化列表中的成员变量。它会更清楚,如果构造函数参数的名字是不一样的数据成员:

Features(int a,int b,int c,int d) 
     : F1(a), F2(b), F3(c), F4(d) { } 

有数据成员的一些命名约定,这样,这些都是很容易识别,并从当地区分它是有用的代码中的变量。实例前缀的m_或使用后_

struct Features { 
    int m_f1; 
    int m_f2; 
    int m_3f; 
    int m_f4; 
    Features(int f1,int f2,int f3,int f4) 
    : m_f1(f1), m_f2(f2), m_f3(f3), m_f4(f4) { } 
}; 

这两个构造函数可以被使用如下:

Features f(11,22,33,44); 
std::cout << f.m_f1 << "\n"; // prints 11 
std::cout << f.m_f2 << "\n"; // prints 22 
std::cout << f.m_f3 << "\n"; // prints 33 
std::cout << f.m_f4 << "\n"; // prints 44 

注意,此构造被定义的事实意味着,编译器将没有再提供一个默认的构造函数。所以,如果你希望能够到这一点:

Features f; 

,那么你需要提供自己的默认构造函数:

Features() : m_f1(), m_f2(), m_f3(), m_f4() {} // initializes data members to 0 
+0

我相信你知道那个juancho,但是对于清晰度:它们不一样,因为C++区分大小写。 'f1'不是'F1'。 – steffen 2012-07-30 13:13:09

+0

@juanchopanza。在这种情况下,我们将mamber变量初始化为什么?换句话说,这里的成员变量是什么值?由于它们是“int”类型,它们是否具有值“0”? – Simplicity 2012-07-30 13:18:41

+0

它们被初始化为传递给'Features'构造函数的参数。我添加了一个小例子。 – juanchopanza 2012-07-30 13:21:28

它的成员变量初始化

你可以这样来做:

Features(int F1,int F2,int F3,int F4) 
{ 
    this->F1 = F1; 
    this->F2 = F2; 
    this->F3 = F3; 
    this->F4 = F4; 
} 

Features(int F1,int F2,int F3,int F4) 
     : F1(F1), F2(F2), F3(F3), F4(F4) { } 

是首选,因为对于用户自定义类型的默认构造函数会自动调用并能给你一些开销。如果您的成员变量没有默认构造函数,则需要在初始化程序列表中初始化它们。恒字段必须在初始化列表中被初始化以及

同时,我认为它只是更加明确使用初始化列表

+1

你可能想说为什么它是首选(即:因为会员保证被初始化) – 2012-07-30 13:12:35

+0

@PauldeLange:我在说,但打字速度有限) – Andrew 2012-07-30 13:13:04

this tutorial读。它应该回答你的问题。

+0

@downvoter:小心解释为什么?我在答案中链接的教程包含对该问题的详细解释。 – 2012-07-30 13:14:44

+0

其他帖子在这里回答问题,这是首选,并获得更多的选票。链接适用于Google。 – 2012-07-30 13:38:54

+0

好的,表示同意。我没有得到任何慷慨的回答,但为什么降价? – 2012-07-30 13:39:59