载自《C++ Primer 第四版》12.4.3节
3. 使用默认构造函数
初级 C++ 程序员常犯的一个错误是, 采用以下方式声明一个用默认构造函数初始化的对象:
//oops! declares a function , not an object
Sales_item myObj();
编译 myObj 的声明没有问题. 然而, 当我们试图使用 myObj 时
Sales_item myObj(); //OK: but defines a function, not a object
if(myObj.same_isbn(Primer_3rd_ed)) //error: myObj is a function
编译器会指出不能将成员访问符用于一个函数! 问题在于 myObj 的定义被编译器解释为一个函数的声明, 该函数不接受参数并返回一个 Sales_item 的对象 ------- 与我们的意图大相径庭!
使用默认构造函数定义一个对象的正确方式是去掉最后的空括号:
//ok! difines a class object
Sales_item myObj; //隐式地调用构造函数 <plus 10.3.2>
另一方面, 下面的这段代码也是正确的:
//ok: create an unnamed, empty Sales_item and use to initialize myObj
Sales_item myObj = Sales_item(); //显示地调用构造函数 <plus 10.3.2>
在这里, 我们创建并初始化一个 Sales_item 对象, 然后用它来按值初始化 myObj . 编译器通过运行 Sales_item 的默认构造函数来按值初始化一个 Sales_item.
----------------------------------------------- 可爱的分割线 ------------------------------------------------------------
本菜鸟就刚好遇到了这个问题, 还好书中有说明呢, 不然就郁闷了. 真是搞不懂编译器为什么解释为函数的声明, 并且是在*.cpp 中.
这个我知道答案了, 看看 <functional> 的源代码, 利用模版类和 () , 执行相关的函数. 比如typename classA, 像 classA() 如果不是声明为函数的话, 那这个 <functional> 库就没作用了.
//ok: create an unnamed, empty Sales_item and use to initialize myObj
在这里, 我们创建并初始化一个 Sales_item 对象, 然后用它来按值初始化 myObj .
上面两句, 我不敢苟同呢, 显示调用构造函数和隐式调用构造函数所进行的操作是一样的. 应该不存在 显示调用构造函数 就是先创建对象, 再对命名对象赋值的情况?????????.
<C++ Primer Plus第五版> 316页, 打消了我的疑问呢, 原来是跟编译器有关呢.