2016-09-14 229 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