我被问到以下班级有多少成员:
class xClass {
private:
int u;
double w;
public:
void func();
void print() const;
xClass();
xClass(int a, double b);
};
我只看到 6,但解决方案说 9?
这是针对 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 个成员。
我阅读了评论,但我不得不说很难说出你的例子中有多少班级成员。我认为 C++ 标准描述中存在一些矛盾。例如,在第 9.2 节类成员中有说
1 类定义中的成员规范声明了类的全部成员;不能在其他地方添加任何成员。
因此,如果在您的示例中遵循标准,则确实只有 6 个成员,因为只有他们参与成员规范。
也符合 C++ 标准
类的成员是数据成员、成员函数 (9.3)、...
如果仔细阅读 9.3 节,我们将看到构造函数、析构函数以及复制和移动赋值运算符没有在其中提及。:) 它们被称为特殊成员函数。但是成员函数中没有提到特殊的成员函数。
所以你可以勇敢地说,班里只有6个。如果有人有问题,让他问 C++ 标准委员会。:)