6

可能重复:
使用空括号调用默认构造函数时出错

我附上了一个测试程序。问题:

如果我像下面这样声明,则不会创建任何对象,并且不会调用默认构造函数。'grCell c3();' // 坏的

但是,这样声明是可以的。创建一个对象并调用它的构造函数。'grCell c1;' // 好的

'grCell c3()' 和 'grCell c1' 有什么区别?

谢谢!

托德

// - - 开始 - - - -

#include <iostream>
#include <cstdio>

typedef unsigned int uint;
using namespace std; 

//
class grCell {
 public:
  grCell()      { printf("HERE_0\n"); };
  grCell(int i) { printf("HERE_1\n"); };
  ~grCell() {};

  void setX(int x) { _x = x; }
  //
  //
private:


  int  _x:22;
};

int main()
{

  grCell c1;  // good
  c1.setX(100);


  grCell c3();  // bad
  c3.setX(100);

  grCell c2(5);
  c2.setX(10);


} 

// - - - 结尾 - - -

4

2 回答 2

7

grCell c3()和 和有什么不一样grCell c1

第一个声明一个函数,而第二个创建一个名为c1type的对象grCell

grCell c3();

它不创建对象,而是声明一个名称c3为不带参数并返回类型对象的函数grCell
它是 C++ 中最令人头疼的解析

于 2012-09-18T04:40:05.500 回答
4

你遇到了最令人头疼的 parse

grCell c3()声明一个名为的函数c3,它返回一个grCell.

grCell c3grCell声明一个名为的实例c3

在 C++ 中,有一句谚语,“任何看起来像函数的东西都是函数”。

关于评论

grCell()被称为值初始化,如果它是类类型,则调用默认构造函数grCell()grCell然而,int()不同int的是,第一个版本零初始化对象。

于 2012-09-18T04:41:11.367 回答