C++中std::string的=,+,+=使用过程中的问题

1. 调用构造函数时的=运算符不支持int,char类型的操作数 

string str1 = 'a';  //error

这是一个构造函数。C++中string是一个类,内部封装了char *来管理这个字符串。

string的构造函数:

  • string() // 创建一个空的字符串
  • string(const char * s)  // 使用字符串s初始化
  • string(const string& s)  // 使用一个string对象初始化另一个string对象
  • string(int n ,char c) // 使用n个字符c初始化(该字符串由n个字符c组成)

所以在初始化的时候没有char类型,所以error

2. 调用赋值运算函数时的=运算符支持int,char类型的操作数

    string str = "aaa";
    str = 'a';  //ok

这是一个赋值操作,把字符a赋值给当前的字符串,正确

3. 使用+和+=运算符

string s1="abc" +"de";    // error

原因:

  • 两个string能相加,是因为string类把运算符+和+=都重载过,+和+=是string的重载函数。也可以把string和字符串常量相加,但必须保证每个加法运算符(+)的两侧的运算对象至少有一个是string
  • 上面例子中的"abc"、"de"都是字符串常量,char是数据的基本类型,不是类,更没有重载过+和+=运算符,是没办法用加号直接相加的,所以会报错。
string s1;
s1=s1+"abc"+"de";  // ok
s1+="abc"+"de";	   // error

原因:

  • s1=s1+"abc"+"de"是对的。前面提到,把string和字符串常量相加,但必须保证每个加法运算符(+)的两侧的运算对象至少有一个是string。s1+"abc"+"de"按照加号从左向右结合的顺序,会先让s1+“abc”,再让这个结果加上"de",然后把这个结果赋给s1。是正确的
  • s1+="abc"+"de"错了。因为要先得到+=右边的内容,也就是进行"abc"+"de",字符串常量,没有办法直接相加,原因如上。
string str = "aaa";
str += 'a';  //ok

    += 字符串拼接 支持char类型 

string s1="abcde";
string s2;
s2+=s1[0]+s1[1]+s1[2];	// error
s2=s2+s1[0]+s1[1]+s1[2]; // ok

 原因:

  • s1[n]返回的是s1的第n个字符的引用,是char类型,+=要先得到等号右边的内容,即进行s1[0]+s1[1]+s1[2],但char是不能直接相加的(几个char直接相加编译器会将它们对应的ASCII码相加,得到一个int型的数,得不到你想要的字符串拼接的效果),所以错误,改成s2=s2+s1[0]+s1[1]+s1[2];是ok的。

你可能感兴趣的:(c++,开发语言)