C ++使用括号声明一个对象

时间:2012-09-18 04:39:03

标签: c++ constructor

  

可能重复:
  Error on calling default constructor with empty set of brackets

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

如果我声明如下,则没有反对创建和 不调用默认构造函数。  'grCell c3();' //糟糕

然而, 声明这样就行了。创建一个对象并调用其构造函数。  'grCell c1;' //好

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

谢谢!

托德

// ---- BEGIN -------

#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);


} 

// ------ END ------

2 个答案:

答案 0 :(得分:6)

  

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

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

grCell c3();

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

答案 1 :(得分:4)

您遇到了the most vexing parse

grCell c3()声明名为c3函数,返回grCell

grCell c3声明grCell名为c3的实例。

在C ++中,有一种说法,“看起来像函数的任何东西都是函数”。

关于评论

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