可能重复:
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 ------
答案 0 :(得分:6)
grCell c3()
和grCell c1
有什么区别?
第一个声明一个函数,第二个声明创建一个c1
类型为grCell
的对象。
grCell c3();
它不会创建一个对象,但会声明一个名为c3
的函数,它不带任何参数并返回grCell
类型的对象。
这是C ++中的 Most vexing parse 。
答案 1 :(得分:4)
grCell c3()
声明名为c3
的函数,返回grCell
。
grCell c3
声明grCell
名为c3
的实例。
在C ++中,有一种说法,“看起来像函数的任何东西都是函数”。
关于评论
grCell()
称为值初始化,grCell()
和grCell
如果是类类型,则调用默认构造函数。但是,int()
和int
不同,第一个版本零初始化对象。