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

use*_*456 5 c++ constructor

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

我附上了测试程序.题:

如果我声明如下,则没有创建对象,并且不调用默认构造函数.'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);


} 
Run Code Online (Sandbox Code Playgroud)

// - - - 结束 - - -

Alo*_*ave 6

grCell c3()和之间有什么区别grCell c1

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

grCell c3();
Run Code Online (Sandbox Code Playgroud)

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


Jes*_*ood 5

你遇到了最令人烦恼的解析

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

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

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

关于评论

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