2

请告诉我为什么当我将构造函数视为没有私有和公共部分的类时,我的程序会被编译和执行,只需class在它前面写下这个词,如下所示:

class sample
{
private:
    int a,b;

public:
    class sample(int a1){a = a1;}
};
4

2 回答 2

5

那是无效的,我的编译器拒绝它。构造函数必须使用类名声明,没有类键(即 noclassstruct关键字union)。

也许您的编译器接受详细的类型说明符作为构造函数名称;但如果是这样,那是一个非标准的扩展,你不应该依赖它。如果幸运的话,编译器可能会提供一个禁用扩展的选项,如果您不想永远与该编译器绑定,则应该使用该选项。

于 2014-07-24T17:57:19.877 回答
1

您提供的代码违反了规范,从技术上讲不应该编译:

12.1 构造函数

1构造函数没有名称。特殊的声明符语法用于声明或定义构造函数。语法使用:

— 一个可选的 decl-specifier-seq,其中每个 decl-specifier 是函数说明符或 constexpr,

— 构造函数的类名,以及

— 参数列表

以该顺序。在这样的声明中,构造函数类名周围的可选括号将被忽略。

函数说明符表示 、 或 -- 参见 7.1.2/1 之一inline--virtualexplicit12.1/4 不允许使用虚拟构造函数)

也就是说,Microsoft Visual C++ 2012 和 2013(至少)接受它。这似乎是那些编译器中的一个错误。

更新:微软知道这个问题,但(可以理解)决定不去修复它。

错误报告

于 2014-07-24T18:14:23.343 回答