-1

我被问到以下班级有多少成员:

class xClass { 
 private: 
 int u; 
 double w; 

 public: 
 void func(); 
 void print() const; 
 xClass();
 xClass(int a, double b); 
}; 

我只看到 6,但解决方案说 9?

4

2 回答 2

2

这是针对 C++ 11 的。

§ 9.2 类成员:

类的成员是数据成员、成员函数 (9.3)、...

§ 12 特殊成员函数:

默认构造函数 (12.1)、复制构造函数和复制赋值运算符 (12.8)、移动构造函数和移动赋值运算符 (12.8) 和析构函数 (12.4) 是特殊的成员函数。[注意:实现将隐式声明这些成员函数...]

这暗示了特殊成员函数确实是成员函数(不像塔斯马尼亚虎,它不是老虎),因此是 9.2 意义上的类成员。

隐式声明的特殊成员函数在类说明符的结束 } 处声明。

这意味着,特殊的成员函数不会在稍后阶段(例如在编译期间)添加到类中;一旦定义了类,它们就在那里。此外,即使不使用特殊成员函数,也会声明它们。

总结一下:在 C++ 11 中,有 11 个成员。在 C++ 03 中,不存在移动构造函数和移动赋值运算符,因此可能有 9 个成员。但是,我没有检查 C++ 03 的措辞,所以可能有 6 个成员。

于 2013-10-20T17:01:49.103 回答
0

我阅读了评论,但我不得不说很难说出你的例子中有多少班级成员。我认为 C++ 标准描述中存在一些矛盾。例如,在第 9.2 节类成员中有说

1 类定义中的成员规范声明了类的全部成员;不能在其他地方添加任何成员。

因此,如果在您的示例中遵循标准,则确实只有 6 个成员,因为只有他们参与成员规范。

也符合 C++ 标准

类的成员是数据成员、成员函数 (9.3)、...

如果仔细阅读 9.3 节,我们将看到构造函数、析构函数以及复制和移动赋值运算符没有在其中提及。:) 它们被称为特殊成员函数。但是成员函数中没有提到特殊的成员函数。

所以你可以勇敢地说,班里只有6个。如果有人有问题,让他问 C++ 标准委员会。:)

于 2013-10-19T19:07:57.067 回答