构造函数的赋值初始化

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

我遇到了一个错误:

在字符串常量之前需要限定符标识符

但是下面的代码可以正常工作:
game lol2 = {2.0,"league of legends2"}; //code 3

我不确定第二段代码的问题所在。有什么想法吗?


您可以使用默认参数将构造函数压缩为一个。 - Sebastian Lenartowicz
为了好玩,添加一个只接受字符串参数的构造函数 .... - Andre Kostur
2个回答

11

你所谓的“分配表单”其实是复制初始化

它相当于从指定的初始化器中构造出一个临时对象,并将其传递给类的复制构造函数或移动构造函数。

因此,以下代码:

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 )
    {}
};
< p > : 语法是构造函数成员初始化列表。

它有时可以更高效,有时是必要的,而且通常更加简洁和常规化。


仅为完整起见:应该是 game(float v = 1.0,string n = "game"),而不是 game(float v = 1.0,string n = "game),因为缺少引号会导致代码无法编译。 - Striezel
@Striezel:谢谢,已修复。 - Cheers and hth. - Alf
@Cheersandhth.-Alf,只有一个小疑问,就像你所说,“它的工作方式就好像从指定为初始化器的单个参数构造临时对象一样,因此根据问题,将创建一个版本为2.0且代码为2的新对象?” - Anil
1
@SubSea:临时变量在实践中总是被优化掉的。这被称为临时变量和复制或移动构造函数调用的“省略”。但是,由于临时变量的构造加上隐式调用复制或移动构造函数调用是规范,因此复制或移动构造函数必须是可访问的,并且不能声明为“显式”。 - Cheers and hth. - Alf

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);

你确定在这个上下文中是逗号运算符吗?你是否收到关于参数类型的投诉?通过在括号中添加(然后你确实会得到逗号运算符)来测试一下。 - Cheers and hth. - Alf
@Cheersandhth.-Alf 噢,这只是糟糕的语法。正在修复。 - NathanOliver
@NathanOliver,这里没有缺少变量声明的错误,但我理解你构建具有多个变量的对象的意思。 - Anil
@SubSea 是的,那不是你实际得到的东西。我只是用人类可读的语言来表达它。 - NathanOliver
@NathanOliver 好的,我知道了.. :) - Anil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接