假设现在有个类叫做
type
, 它有个无参数的构造函数, 那么下面的代码type object();
是巫师学徒们常犯的错误, 这个语句实际上是声明了一个叫做
object
的函数, 它返回一个 type
对象. 施展无参构造魔法的正确咒语是type object;
此外, 还有一个很吐血的咒术是
type(object);
同样是定义一个名字为
object
类型为 type
的对象. 是否很震惊? 其实这里的括号是可以任意加的, 如type object;
type(object);
type((object));
如果现在它有个构造函数需要一个
int
类型参数, 那么下面这两种代码type object = 0;
type object = type(0);
type object(0);
因为当
type
的构造函数是如下定义时第一种写法是编不过去的struct type {
explicit type(int);
};
delete
掉或者置于 private
或 protected
封印之下, 编译器会给出一个恼人的错误.PS: 在 The C++ Programming Language (C++ 程序设计语言) 一书中, 11.3.3 中有提到一个例子
... For example,
complex b = 3;
means
complex b = complex(3);
我认为这一处是错误的, 原因如上所说.
好, 现在再回到刚才那个括号打水漂的定义方式, 下面这种写法
int a = 3;
type(a);
type
对象么? 当然不是, 编一下就会知道, 那仍然是在定义一个名字为 a
的对象, 即使 type
没有无参构造函数.