赋值初始化构造函数

时间:2016-09-14 16:22:37

标签: c++ constructor

我正在尝试调用构造函数的不同版本,我想出了这个

#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

我收到错误:

  

字符串常量

之前的预期unqualified-id

但是下面的代码工作正常:

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

我没有得到第二个代码究竟是什么问题。有什么想法吗?

2 个答案:

答案 0 :(得分:11)

你打电话给什么?#34;转让表格&#34;是复制初始化

它就像一个临时对象是由一个参数构造的,它被指定为初始化器,然后被传递给类&#39;复制构造函数或移动构造函数。

所以,代码

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

...在语法上无效。

提示:除了三个构造函数,第二个添加第一个参数,第三个添加第二个参数,您可以使用默认参数值:

class game{

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

:语法是构造函数成员初始化列表。

它有时可能更有效,有时是必要的,无论如何通常更简洁和传统。

答案 1 :(得分: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);