2

我記得我曾經是能夠做到這一點,必須按預期工作變量名:使用「這 - >」,將內部構造

class foobar 
{ 
public: 
    foobar(int x, int y) 
    { 
     x = x; //the variables x, y belonging to the class got correctly initialized 
     y = y; 
    } 

private: 
    int x, y; 
}; 

以上在大約200X工作在微軟的Visual C++ 6.0還有一些更新的版本,我相信。
但現在我必須這樣做在微軟工作室2013年和我必須使用this->,因爲這樣的:

class foobar 
{ 
public: 
    foobar(int x, int y) 
    { 
     this->x = x; //the other way no longer initializes class vars 
     this->y = y; 
    } 

private: 
    int x, y; 
}; 

是否有語言規範變化或微軟編譯器的變化?

+0

自VC6以來,出現了兩種巨大的語言變化。但是我不知道它是遵循1998年以前的標準規則還是自己的規則,因爲我還不夠年齡,無法在1998年之前使用C++。第一個版本肯定是錯誤的,因爲至少是C++ 98。 – 2014-11-06 16:52:44

+0

你沒有使用[初始化列表](http://www.cprogramming.com/tutorial/initialization-lists-c++.html)的原因? @Mgetz在這裏不適用,你有條件倒退 – clcto 2014-11-06 16:56:32

回答

8

也許你所想的,而不是初始化列表語法,是明確的,要對任何(非越野車)C++編譯器正常工作:

foobar(int x, int y) : x(x), y(y) { } 

在這種情況下,前xy parens是明確的數據成員,因爲這是唯一可以去那裏(除了父類型的構造函數)。在parens內部,xy引用影響數據成員的構造函數參數。

我想不出有什麼情況下x = x;除了沒有操作自我分配(除了用戶定義的賦值操作符超載外)。如果這在以前的VC++版本中工作,那麼它會是一個VC++編譯器錯誤。更有可能的是,你曾經使用初始化列表語法(這是行得通的),並忘記了這就是你所做的。

+0

我很確定我沒有使用初始化列表,這是一種「更高級」的語法,我之前沒有學習過。但是我可能忘記了我做了什麼,也就是很可能我實際上在使用'this->',也許我的困惑是圍繞着可以爲'this-> x'和'x'使用相同的變量名,而不必使用'_x'或類別成員var – Dennis 2014-11-06 17:37:58

2

或這個。

class foobar { 
public: 
    foobar(int x, int y) : x(x), y(y) 
    { 
    } 

private: 
    int x, y; 
}; 
+2

的另一個不同名稱的變量達恩chhowie,停止鍵入比我快:) – Surt 2014-11-06 16:57:33