string类在C++与C#中都是一种经常使用的类型,对字符串的操作比对字符数组的操作方便很多,今天在这里记录一下C++和C#中的string的区别与注意事项。
在C++中,string的每一个字符串的结尾都是字符'\0',因此字符串的占用的内存比表面上使用的字节数多一。在C++中需要注意的是,C++将const字符串保存在常量存储区,当多个指针指向同一个const字符串时,者几个指针指向的内存地址是相同的,例如如下代码:
int main()
{
char c;
char str1[] = "string";
char str2[] = "string";
const char* str3 = "string";
const char* str4 = "string";
if (str1 == str2)
{
cout << "str1 and str2 are same" << endl;
}
else
{
cout << "str1 and str2 are different" << endl;
}
if (str3 == str4)
{
cout << "str3 and str4 are same" << endl;
}
else
{
cout << "str3 and str4 are different" << endl;
}
cin >> c;
return 0;
}
在这段代码中,我们得到的输出结果为:
str1 and str2 are different
str3 and str4 are same
因为str1和str2是数组,我们会分配相应字节数的空间然后将字符串内容复制到相应数组重区,因此他们的地址是不同的,但是str3和str4是指针,我们不需要分配空间来保存string内容,又因为"string"是一个cosnt字符串,因此在内存中只有一个拷贝,所以他们指向的地址为同一个地址。
在C#中,string类是引用类型的数据类型。它有一个非常特殊的性质:string的内容是不能改变的,一旦试图改变string的内容,就会产生一个新的string实例,例如如下代码:
class Program
{
static void Main(string[] args)
{
string str = "string";
Console.WriteLine(str);
str.ToUpper();
Console.WriteLine(str);
string STR = str.ToUpper();
Console.WriteLine(STR);
}
}
程序输出结果为:
string
string
STRING
可以看出string调用其成员函数不会修改自身的值,而是返回对应结果形成一个新的实例。
由于每一次生成一个新的实例有些开销过大,因此在C#中有一个新的类型StringBuilder,可以容纳修改后的结果,因此对于需要连续多次修改的string,可以考虑使用StringBuilder。