我无法理解字符串中赋值的某些特定行为。
//method 1
std::string s;
s+='a' //This works perfectly
但是
//method2
std::string s;
s="" + 'a';//This gives unexpected value
为什么第二种方法会产生意外的价值?从我所读取的字符串默认构造函数初始化字符串变量为空字符串,如果没有指定构造函数。 And s+='a'
应与s=s+a
相同。那么为什么方法2与方法1不一样呢?
还有一个关于同一主题的查询,如果我们无法使用char literal初始化字符串,那么我们如何为其分配char文字?
std::string s2='a'//gives error while compiling
,而
std::string s2;
s2='a'//works perfect
根据我的理解,我们不能通过char变量初始化字符串变量,因为字符串构造函数需要类型为(const char *)
的参数。分配时为什么没有这样的限制?
答案 0 :(得分:2)
第一次查询
方法1完美地起作用,因为在这个方法中你要添加字符串对象类型和字符文字。
和s+='a'
确实与s=s+'a'
关注s是字符串对象类型而不是字符串文字的事实。
在第二种方法中,您要添加字符串文字 和char字面。重点关注两者之间的区别,在第一种方法中有字符串对象可以将字符串或字符文字添加到字符串对象类型中,它是字符串对象类型提供的功能之一。但你不能添加简单地相互添加文字。在c ++中,然而“StringLiteral1”“StringLiteral2”将导致两个字符串文字的串联。
进行第二次查询,
初始化与赋值不同,字符串对象默认构造函数需要const char *
初始化。作业是一个完全不同的故事(如果不是,有人请纠正我)。
答案 1 :(得分:2)
""
是类型为const char[]
的字符串文字,您要将字符串文字,即指向第一个元素'\0'
的指针添加到另一个字符。这自然会给你一些你想要的东西。
如果您希望它与s += 'a'
相同,则需要使用std::string
字面值:s += ""s + 'a';
。这是有效的,因为""s
是一个空std::string
,你只需要添加另一个字符。
答案 2 :(得分:0)
撰写s="" + 'a';
时请注意""
不是std::string
而是const char*
。并且const char*
没有预定义的连接运算符。这就是为什么你有一个意想不到的行为而不是连接。