c++ 在默认构造函数中使用初始化器列表时出现冗余字符串初始化警告[重复]

j1dl9f46  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(90)

此问题在此处已有答案

Benefits of Initialization lists(5个答案)
Why should I prefer to use member initializer lists?(9个答案)
Advantages of using initializer list? [duplicate](5个答案)
3天前关闭.

class person
{
private:
    std::string name;
    int hungerLevel;
    std::string location;
    int money;
public:
    person() : name(""), hungerLevel(100), location(""), money(0) {}
};

当我使用初始化器列表在默认构造函数中将字符串变量初始化为空字符串时,我得到警告“冗余字符串初始化”。

class person
{
private:
    std::string name;
    int hungerLevel;
    std::string location;
    int money;
public:
    person() : hungerLevel(100), money(0)
    {
        name = "";
        location = "";
    }
};


然而,当我在构造函数的主体中将字符串初始化为空字符串时,如上所述,我没有得到任何错误。我不确定这个警告是否仅与我使用的IDE有关,或者其中之一是正确的方法/良好的实践。

mnowg1ta

mnowg1ta1#

你的问题的要点已经在评论中得到了回答,但是你可以通过这样声明你的类来完全避免构造函数:

class person
{
private:
    std::string name;
    int hungerLevel = 100;
    std::string location;
    int money = 0;
};

字符串
这(对我来说)有一个巨大的好处,你可以在同一个地方声明和初始化所有的成员变量,避免忘记在构造函数的初始化列表中初始化一个成员变量的危险(这通常会发生在你添加一个新的成员变量时)。这也意味着即使你添加另一个构造函数,这些变量也会被正确初始化,这是一个双赢的局面。
正如其他人所说,编译器将发出代码来自动初始化您的std::string s(通过调用默认构造函数),因此这将照顾自己。

lb3vh1jj

lb3vh1jj2#

赋值不是初始化,静态分析器可以检测到的是有限制的(尽管在任何一种情况下,一些高级分析器都会向你唠叨)。std::string不是一个简单的构造类,所以它的构造函数无论如何都会被调用,所以两者都是多余的。
保留初始化列表的另一个原因(同时使用Paul Sander的建议)是为了以以下形式重用代码:

class person
{
    std::string name;
    int hungerLevel = 100;
    std::string location;
    int money = 0;
public:
    person(std::string birthName, std::string home) 
    : name(birthName), location(home) { 
         registerNewPerson(); 
    } 

    person() 
    : person("John Doe", defaultLocation()) { 
         reportJD();
    }
};

字符串
hungerLevelmoney总是有相同的初始化,person(string, string)是一个构造函数,可以在其他场景中重用。

相关问题