我需要初始化std::string吗?

5

I have this code:

class myclass
{
    std::string str;
public:
    void setStr(std::string value)
    { 
        str=value;
    }
    std::string getStr()
    {
        return str;
    }
 }

 main()
 {
   myclass ms;
   std::cout<<ms.getStr()<<std::endl;
 }

当我编译并运行此代码时,在Windows中始终会得到空字符串"",且没有错误。
这种情况总是有效吗?
我需要上述行为,即如果用户未调用set,则str始终为空字符串。
我应该在构造函数中初始化str,如下所示:
class myclass
{
    std::string str;
public:
    myclass():str(""){}
    void setStr(std::string value)
    { 
        str=value;
    }
    std::string getStr()
    {
        return str;
    }
 }

我希望确保在所有平台上的行为都是一致的,同时也要确保代码尽可能地小巧精致。


3
不需要。 - llllllllll
@liliscent 这个行为有保证吗?字符串的构造函数被调用了吗?它们是在什么时候被调用的? - mans
@drescherjm 谢谢,现在已经修复。 - mans
2个回答

8

我需要初始化std :: string吗?

不需要。 std :: string 的默认构造函数会为您初始化一个漂亮的空字符串。

我希望确保所有平台上的行为都相同,并确保代码尽可能小而整洁。

然后去除冗余:

struct myclass {
    std::string str;
};

基本类型不会在默认情况下得到初始化,您需要显式地进行初始化:

struct myclass {
    std::string str;
    int i = 1; // <--- initialize to 1.
};

如果类中也有一个int,它会被初始化为零吗? - mans
1
@各位,查看有关特定构造函数的文档(RTFM)是一个好习惯。在这里,去阅读std::string::string()(字符串的默认构造函数) - YSC

0

你不需要用空字符串初始化一个 string 成员,尽管这样做可能有帮助。考虑以下代码:

struct foo {
    std::string a;
    std::string b;
    foo() : a("foo") {}
};

在构造函数中,b 没有被赋值是故意的还是偶然的?我更喜欢

foo() : a("foo"), b() {}

因为它明确了意图,而且不需要花费什么(不算几个按键)。


2
foo() : a("foo"), b() {} 怎么样? - NathanOliver
@NathanOliver 更好 - 463035818_is_not_a_number

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