C++中,字符串(character string)最为基本的表达方式就是使用一个以空字节(‘\0’)为结束符的字符数组。下面的4个函数给出了字符串的这些方式:
void hello1()
{
const char str[] = {'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\0'};
std::cout<< str <<std::endl;
}
void hello2()
{
const char str[] = "Hello world!";
std::cout<< str <<std::endl;
}
void hello3()
{
std::cout<< "Hello world!"<<std::endl;
}
void hello4()
{
const char* str = "Hello world!";
std::cout<< str << std::endl;
}
- 在第一个函数中,把字符串声明为一个数组,并且艰难地对其进行了初始化。需要注意结尾处的“\0”结束符,它表明这里是字符串的结尾。
- 第二个函数具有相似的数组定义形式,但是这一次使用一串字符文字来初始化数组。在C++中,字符串中的文字是以隐式“\0”结束符结尾的简单常量字符数组。
- 第三个函数直接使用字符文字,而没有给它指定名字。但一旦转化为机器语言指令,它就与前面的两个函数一样了。
- 第四个函数则有一点不同,在于它创建的不仅是一个(匿名)数组而且是一个称为str的指针变量,并且用这个指针来存储数组第一个元素的地址。无论这里的形式如何,从语义上来讲,这个函数与前面三个函数都一样,并且一个优化过的编译器会删除这个多余的str变量。
以C++字符串作为参数的函数通常都带有char, 或者const char。这里给出的一小段程序显示了这两种方法的用法:
#include <cctype>
#include <iostream>
void makeUppercase(char *str)
{
for(int i = 0; str[i] != '\0'; ++i)
{
str[i] = std::toupper(str[i]);
}
}
void writeLine(const char* str)
{
std::cout<< str << std::endl;i
}
int main(int argc, char* argv[])
{
for(int i =1; i < argc; ++i)
{
makeUppercase(argv[i]);
writeLine(argv[v]);
}
return 0;
}
在C++中,char类型通常保存为8位的值。这就是说,我们可以毫不费力地在一个char数组中存储ASCII,ISO 8859-1(Latin-1)以及其他采用8位编码的字符串,但是在没有使用多字节序列的情况下,就不能存储任意的Unicode字符。Qt提供了强大的QString类,它会把Unicode字符串存储为16位QChar,同时在内部还会使用隐式数据共享(“写时复制”)的优化技术。第11章和第18章曾经详细地介绍了QString类。
网友评论