这个问题已经在这里有了答案:




已关闭8年。






我附有测试程序。
问题:

如果我这样声明,则不会创建任何异议,并且
默认的构造函数没有被调用。
'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);


}

//- - - 结尾 - - -

最佳答案



第一个声明一个函数,第二个创建一个名为c1的对象,其类型为grCell

grCell c3();

它不会创建对象,而是声明一个名称为c3的函数,该函数不带任何参数并返回grCell类型的对象。
它是C++中的 Most vexing parse

10-04 15:11