2016-01-07 212 views
0

這個問題是關於C++中的對象實例化的。有幾種方法可以在堆和堆棧上實例化對象我很想知道細微的差異。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是一個簡單的類,我使用這個示範:

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}之間存在細微的差異。如果有人能夠闡明這些特質,我將不勝感激。

+2

[最令人煩惱的解析](https://en.wikipedia.org /維基/ Most_vexing_parse) – AndyG

回答

1

此行

Raisin z(); 

聲明一個功能(不帶參數)返回一個葡萄乾對象,而不是缺省構造葡萄乾