我是靠谱客的博主 尊敬仙人掌,最近开发中收集的这篇文章主要介绍C++学习笔记(二)C风格字符串和string类区别和联系一、概述二、C语言中的字符串三、C++中的字符串四、C风格字符串和string类的转换,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一、概述
有时候在使用字符串时,总把C++的字符串类型和C风格的字符串混淆,或者独立为不同概念,为此特定查找资料,总结两者之间的区别和联系。如有错误,恳请指出。
二、C语言中的字符串
在C语言中,对字符串的处理主要是使用字符数组(以空字符’ ’为结尾)或者是指向字符类型的指针,即用char*,但指针在实现字符串类型是较为麻烦的。用法如下:
//example 1
char str[15]="Hello world!"; //使用字符数组, 也可以char str[] ="Hello world!";
*(str+2)=’L’;
//使用*()指定数组修改位置改变第3个字母
char *p= str;
//使用指针p指向数组str的首地址
*(p+2)=’L’;
//仍可间接修改数组str的第3个字母
char *ptr ="Hello world!";
//使用指针指向一行字符串;
*(ptr+2)='L';
//错误,编译虽通过,但无法改变字符串的第3个字母
这是因为第一个字符串是由数组str开辟的,数组的每个值是可以改变的变量,而第二个指针ptr指向的是字符串常量,而字符串常量是无法改变的,故为了避免误判,指向字符串常量时应该使用const指针。
如 const char *ptr ="Hello world!"
//example 2
char *ptr = new char[15];
//由new在堆中开辟的15个char型空间,ptr指向该空间首地址
ptr = "abcdefg";
//错误,不可再用ptr指向另一行字符串首地址
ptr[0]='A';
//可由ptr[下标]或*(ptr+索引)写或读数据,用后者指针的形式速度较快
*ptr ='a';
//可改变ptr[0]的值
由于是堆分配的内存,故函数调用结束后,不会自行撤销,故需要在函数加入delete []ptr ;语句。
三、C++中的字符串
由于C风格字符串较为复杂,不适合大程序的开发,故C++标准库定义了string类,头文件形式为#include <string>,而头文件<string.h>和<cstring>都是错误的,这两个头文件主要定义处理C风格字符串的一些方法,譬如strlen(), strcpy()等。第一个为C的头文件格式,第 2个为C++的C风格头文件。
先看sting类的原形:
//example 3
class String
{
public:
String(const char *str = NULL);// 普通构造函数
String(const String &other); //拷贝构造函数
~ String(void); //析构函数
String & operator =(const String &other);//赋值函数
private:
char *m_data;// 用于保存字符串
};
//普通构造函数
String::String(const char *str)
{
if(str==NULL)
{
m_data = new char[1]; // 对空字符串自动申请存放结束标志'