假设现在有个类叫做
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 没有无参构造函数.