C++ 字符串赋值

C++ 字符串赋值,c++,string,C++,String,我很难理解字符串中赋值的某些特殊行为 //method 1 std::string s; s+='a' //This works perfectly 但是 为什么第二种方法会给出意外的值?根据我读到的字符串默认构造函数,若并没有指定构造函数,那个么将字符串变量初始化为空字符串。s+='a'应该与s=s+a相同。那么为什么方法2和方法1不一样呢 还有一个关于同一主题的查询,如果我们不能用char-literal初始化字符串,那么我们如何为它分配char-literal呢 std::string

我很难理解字符串中赋值的某些特殊行为

//method 1
std::string s;
s+='a' //This works perfectly
但是

为什么第二种方法会给出意外的值?根据我读到的字符串默认构造函数,若并没有指定构造函数,那个么将字符串变量初始化为空字符串。s+='a'应该与s=s+a相同。那么为什么方法2和方法1不一样呢

还有一个关于同一主题的查询,如果我们不能用char-literal初始化字符串,那么我们如何为它分配char-literal呢

std::string s2='a'//gives error while compiling
鉴于

std::string s2;
s2='a'//works perfect

据我所知,我们不能逐个char变量初始化字符串变量,因为字符串构造函数需要typeconst char*参数。为什么在赋值时没有这样的限制?

当你写s=+'a';请记住,这不是std::string,而是const char*。const char*没有预定义的连接运算符。这就是为什么会出现意外的行为而不是串联;请记住,这不是std::string,而是const char*。const char*没有预定义的连接运算符。这就是为什么会出现意外的行为而不是连接。

对于第一个查询

方法1工作得非常好,因为在这个方法中您添加了字符串对象类型和字符文本。 s+='a',实际上与s=s+'a'相同

请注意,s是字符串对象类型,而不是字符串文字

在第二种方法中,您将添加字符串文字 和字符文字。请关注两者之间的区别,在第一种方法中,有一个string对象,您可以向string对象类型添加string或char文本,这是string对象类型提供的特性之一。但是,不能简单地添加彼此的文字。在C++中,String文字1 String文字2将导致两个字符串文字的串联。

对于第二个查询


初始化与赋值不同,字符串对象默认构造函数使用const char*进行初始化。作业是完全不同的故事如果不是,请有人纠正我。

对于您的第一个问题

方法1工作得非常好,因为在这个方法中您添加了字符串对象类型和字符文本。 s+='a',实际上与s=s+'a'相同

请注意,s是字符串对象类型,而不是字符串文字

在第二种方法中,您将添加字符串文字 和字符文字。请关注两者之间的区别,在第一种方法中,有一个string对象,您可以向string对象类型添加string或char文本,这是string对象类型提供的特性之一。但是,不能简单地添加彼此的文字。在C++中,String文字1 String文字2将导致两个字符串文字的串联。

对于第二个查询

初始化与赋值不同,字符串对象默认构造函数使用const char*进行初始化。赋值是一个完全不同的故事如果不是,请有人纠正我。

是一个const char[]类型的字符串文字,您正在将字符串文字,即指向第一个元素“\0”的指针添加到另一个字符。这自然会给你一些超出你预期的东西

如果希望它与s+='a'相同,则需要使用std::string literal:s+=s+'a';。这是可行的,因为s是一个空的std::string,您只需向其中添加另一个字符。

是一个const char[]类型的字符串文字,您正在向另一个字符添加字符串文字,即指向第一个元素“\0”的指针。这自然会给你一些超出你预期的东西


如果希望它与s+='a'相同,则需要使用std::string literal:s+=s+'a';。这是可行的,因为s是一个空的std::string,您只需向其中添加另一个字符。

foo不是std::string,它是一个字符串文本,它是一个字符数组,或多或少是一个char const*。如果要对其执行std::string类型的操作,必须首先将其转换为一个:std::stringfoo.BoBTFish是正确的,请尝试std::string+'a'提高警告级别。我打赌您会收到警告。或者,如果您知道用户定义的文本,请使用名称空间std::string\u literals;foos+..@BoBTFish我想现在我明白我的错误了,谢谢你提供的信息。foo不是std::string,而是string literal,它是一个char数组,或多或少是一个char const*。如果要对其执行std::string类型的操作,必须首先将其转换为一个:std::stringfoo.BoBTFish是正确的,请尝试std::string+'a'提高警告级别。我打赌您会收到警告。或者,如果您知道用户定义的文本,请使用名称空间std::string\u literals;foos+..@BoBTFish我想现在我明白我的错误了,谢谢你提供的信息。const char*没有预定义的+运算符。是的。听说过指针算术吗?OP说+`` a不会给出错误,而是意外的结果。它仍然不是错误,但是 意外的行为。如果写入abcd+2,则返回一个指向字符串中c的指针。如果添加5,将在尾随“\0”之后获得一个指针。如果您添加了大于5的任何内容,您将获得一个无效指针。我记不起该添加是未定义的行为,还是仅*使用指针是UB'的值几乎肯定是97,将其添加到指向单个空字符的指针可能最终指向随机内存。而const char*没有预定义的+运算符。是的。听说过指针算术吗?OP说+`` a不会给出错误,而是意外的结果。它仍然不是错误,而是意外的行为。如果写入abcd+2,则返回一个指向字符串中c的指针。如果添加5,将在尾随“\0”之后获得一个指针。如果您添加了大于5的任何内容,您将获得一个无效指针。我记不起该添加是未定义的行为,还是仅*使用指针是UB'的值几乎肯定是97,将其添加到指向单个空字符的指针可能最终指向随机内存。默认构造函数使用const char*如果它使用参数,则它不是默认构造函数。它只是一个非默认构造函数。默认构造函数接受const char*如果它接受一个参数,它就不是默认构造函数。它只是一个非默认构造函数。
std::string s2;
s2='a'//works perfect