C++ 对象实例化

C++ object instantiations

这个问题是关于 C++ 中的对象实例化的。有几种方法可以在堆上和堆栈上实例化对象,我很想知道其中的细微差别。

using namespace std;

class Raisin
{
private:
    int x;
public:
    Raisin():x(3){}
    Raisin(int input):x(input){}
    void printValue()
    {
       cout<< "hey my Deliciousness is: " << x <<endl;
    }
};

基本上 Raisin 是我用于此演示的简单 class:

int main()
{

Raisin * a= new Raisin;
a->printValue();

Raisin * b= new Raisin{};
b->printValue();

Raisin * c= new Raisin();
c->printValue();

Raisin x;
x.printValue();

Raisin y{};
y.printValue();

Raisin z();
z.printValue(); 
//error: request for member 'printValue' in 'z', 
//which is of non-class type 'Raisin()'


Raisin alpha(12);
alpha.printValue();

Raisin omega{12};
omega.printValue();

return 0;
}

我想知道为什么Raisin * c可以用空括号实例化,但是Raisin z不能。 (实际上Raisin z()是合法的但不正确)

我也知道 Raisin (2)Raisin{2} 之间存在细微差别。如果有人能阐明这些特质,我将不胜感激。

这一行

Raisin z();

声明一个返回 Raisin 对象的函数(不带参数),而不是 default-constructed Raisin