【C/C++】字符串

  C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数.

首先说一说字符指针和字符数组的区别

char* s1 = "hello world";
char s2[] = "hello world";

  上面两个字符串虽然内容都是"hello world",但是两个并不相等,s1是指向内存中代码段的空间,而s2是在上开辟空间来存取"hello world" ,注意字符串的最后一个字符会是一个’\0’。两个指针指向的是内存不同空间
  值得一提的是,C++兼容C,自然这种字符串在C++中也适用,但是,C++的类型检查要比C语言严格,上面的s1在高版本C++编译器会报错:"const char* "的值不能用于初始化"char* "类型的实体 。

头文件的区别

  值得注意的是<string.h>和< string > 是两个不同的头文件,C语言中字符串函数及一些内存操作函数都是在<string.h>头文件中。而C++的字符串(string类)在< string > 头文件中。还有string类的封装都在命名空间std内,所以一定要声明命名空间std

string类

  C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
  这是对C++中string类的介绍:(建议大家多读一读英文文档)
http://www.cplusplus.com/reference/string/string/?kw=string

string类的简单模拟

  String类对字符串进行封装,讲给String类一个私有成员变量 char* _str;
  在这里我将不会把所有函数模拟,而是写一些需要注意的点(包括默认构造、析构、拷贝构造、赋值运算符重载)。

1.默认构造
  • 即使string对象一个字符都没有,也要给它申请一个空间,来存放’\0’;
    :这里即使是空串,也不能让_str = nullptr,string类中有一个函数c_str(),这是将string对象返回一个C语言的字符串形式,如果_str为空,调用这个函数时,将造成非法访问。
String(const char* str = "") : _str(new char[strlen(str) + 1]) 
{
		strcpy(_str, str);
}
2.析构
~String() 
{
	if (_str) {
		delete[] _str;
		_str = nullptr;
	}
}
3.拷贝构造

需要注意的是这里不能使用简单的浅拷贝,而是要采用深拷贝
(下图解释深拷贝和浅拷贝的区别)
如果采用浅拷贝,s2声明周期结束,将释放s1指向的那片空间,s1就会不复存在

在这里插入图片描述

String(const String& str) : _str(new char[strlen(str._str) + 1]) 
{
		strcpy(_str, str._str);
}
//拷贝构造新写法
//通过调用临时构造临时变量的方式实现了代码复用
String(const String& str) : _str(nullptr)
{
		String tmp(str._str);	//tmp被交换的_str是随机值,析构会有问题,所以要给_str空(中间值)
		swap(_str, tmp._str);
}
4.赋值运算符重载

同样是采用深拷贝的方式

String& operator=(const String& str) 
{
	if (this != &str) {
		delete[] _str;
		_str = new char[strlen(str._str) + 1];
		strcpy(_str, str._str);
	}
	return *this;
}
//等号重载新写法,把参数改成下面,会节省代码
//通过传普通对象,调用拷贝构造,实现代码复用
String& operator=(String str) {
	swap(_str, str._str);
	return *this;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值