C++ 菜鸟使用默认构造函数容易出现的错误

载自《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页, 打消了我的疑问呢, 原来是跟编译器有关呢.

 

你可能感兴趣的:(C++ 菜鸟使用默认构造函数容易出现的错误)