这个结构试图做什么?

时间:2012-07-30 13:08:28

标签: c++ struct

在以下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) { }

感谢。

3 个答案:

答案 0 :(得分:8)

使用构造函数的初始化列表初始化成员变量。如果构造函数参数的名称与数据成员的名称不同,那就更清楚了:

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

答案 1 :(得分:2)

是成员变量初始化

你可以这样做:

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) { }

首选,因为对于用户定义的类型,默认构造函数将自动调用,并且可以为您提供一些开销。如果您的成员变量没有默认构造函数,则必须在初始化列表中初始化它们。必须在初始化列表中初始化常量字段

而且我认为使用初始化列表更加清晰

答案 2 :(得分:1)

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