2016-09-14 217 views
8

我嘗試了不同的版本調用構造函數,我想出了這個分配初始化

#include<iostream> 
#include<string> 
using namespace std; 
class game{ 

    public: 
     float version; 
     string name; 
     game() 
     { 
      name = "game"; 
      version = 1.0; 
     } 
     game(float v,string n) 
     { 
      version = v; 
      name = n; 
     } 
     game(float v) 
     { 
      version = v; 
      name="any"; 
     } 
}; 
int main() 
{ 
    game lol1(1.0,"league of legends"); //functional form 
    game lol2 = 2.0; //assignment form 
    game lol3{3.0,"league2"}; //uniform initialization 
    game *pt = &lol1; 
    cout<<pt->name<<endl; 
    return 0; 
} 

每個語句編譯,但如果我寫

game lol2 = 2.0,"league of legends2"; //code 2 

我得到一個錯誤:

expected unqualified-id before string constant

但下面的代碼工作正常:

game lol2 = {2.0,"league of legends2"}; //code 3 

我不明白第二個代碼到底是什麼問題。有任何想法嗎?

+0

您可以使用默認參數將構造函數壓縮爲單個構造函數。 –

+0

爲了娛樂,添加一個構造函數,只需要一個字符串.... –

回答

11

你所謂的「賦值表單」是拷貝初始化

它的工作原理就好像一個臨時對象是從構造的單個參數指定爲初始化程序,然後傳遞給類的拷貝構造函數或移動構造函數。

所以,代碼

game lol2 = 2.0,"league of legends2"; //code 2 

&hellip;在語法上是無效的。


提示:而不是三個構造,其中第二增添了第一個參數,第三增加了第二個參數,你可以使用默認參數值:

class game{ 

public: 
    float version; 
    string name; 
    game(float v = 1.0,string n = "game") 
     : version(v), name(n) 
    {} 
}; 

:語法是構造函數成員初始化列表。

它有時可能更有效率,有時是必要的,無論如何通常更簡潔和傳統。

+0

我明白了。謝謝 – Anil

+0

只是爲了完整性:它應該是遊戲(float v = 1.0,string n =「game」)',而不是'遊戲(float v = 1.0,string n =「遊戲)',因爲代碼不會在缺少引號的情況下編譯。 – Striezel

+0

@Striezel:謝謝,修正。 –

4

您沒有使用正確的語法從多個值初始化對象。當你做

game lol2 = 2.0,"league of legends2"; 

的語法像

type name1 = value1, name2 = value2; 

逗號後需要一個變量名稱,以便您得到一個錯誤,因爲你有

type name1 = value1, value2; 
        ^missing variable declaration here 

當你有你需要多個變量與您一起構建只能使用以下格式

type name = {value1, value2, ..., valuen}; 
type name{value1, value2, ..., valuen}; 
auto name = type{value1, value2, ..., valuen}; 
type name(value1, value2, ..., valuen); 
auto name = type(value1, value2, ..., valuen); 
+0

你確定它在這方面的逗號操作符?你得到一個關於參數的類型投訴?周圍加一個括號進行測試(然後你得到逗號運營商肯定)。 –

+0

@ Cheersandhth. - 阿爾夫哎呀,它只是語法錯誤。固定 – NathanOliver

+0

@NathanOliver,有喜歡這裏缺少可變declartion沒有錯誤,但我得到您在多個變量中構建對象的要點。 – Anil