请告诉我为什么当我将构造函数视为没有私有和公共部分的类时,我的程序会被编译和执行,只需class
在它前面写下这个词,如下所示:
class sample
{
private:
int a,b;
public:
class sample(int a1){a = a1;}
};
请告诉我为什么当我将构造函数视为没有私有和公共部分的类时,我的程序会被编译和执行,只需class
在它前面写下这个词,如下所示:
class sample
{
private:
int a,b;
public:
class sample(int a1){a = a1;}
};
那是无效的,我的编译器拒绝它。构造函数必须使用类名声明,没有类键(即 noclass
或struct
关键字union
)。
也许您的编译器接受详细的类型说明符作为构造函数名称;但如果是这样,那是一个非标准的扩展,你不应该依赖它。如果幸运的话,编译器可能会提供一个禁用扩展的选项,如果您不想永远与该编译器绑定,则应该使用该选项。
您提供的代码违反了规范,从技术上讲不应该编译:
12.1 构造函数
1构造函数没有名称。特殊的声明符语法用于声明或定义构造函数。语法使用:
— 一个可选的 decl-specifier-seq,其中每个 decl-specifier 是函数说明符或 constexpr,
— 构造函数的类名,以及
— 参数列表
以该顺序。在这样的声明中,构造函数类名周围的可选括号将被忽略。
(函数说明符表示 、 或 -- 参见 7.1.2/1 之一inline
--virtual
但explicit
12.1/4 不允许使用虚拟构造函数)
也就是说,Microsoft Visual C++ 2012 和 2013(至少)接受它。这似乎是那些编译器中的一个错误。
更新:微软知道这个问题,但(可以理解)决定不去修复它。