C++的string类

 

 

string类称为”字符串类”.它是basic_string模板类的一个实例.(typedef basic_string<char, char_traits, allocator> string)

它很像一个可以动态增长的数组,只是数组元素类型是char,并且末尾有字符串结尾标志’\0’。

string类对象的构造:

string类对象的构造函数有很多不同的形式,即我们可以用不同的方式构造一个string类的对象,最常用的是以下5个。

(1)string() 构造空的string对象

(2)string(const char* s) 用C形式字符串构造string类对象

(3)string(const string& s) 拷贝构造

(4)string(size_t n, char c) 用n个字符c构造string类对象

(5)string(const string&s, size_t n) 用一个string类对象s的前n个字符构造新的string类对象

string类对象拷贝构造、赋值运算符重载、析构:

由于这三个函数比较特殊,并且特殊的原因相同,所以放在一起说。对于一个类,如果其成员变量不持有资源(即成员变量是简单的int、char类型)的话,我们是不需要手动编写拷贝构造函数、赋值运算符的重载、析构函数的,因为系统默认提供给我们的成员函数就足够了。原因是:系统提供的拷贝构造、赋值都是“浅拷贝”,就是值拷贝,我是多少就给你拷多少,这对于简单的int类型是没有问题的。但是,当我们的成员变量持有资源时,如有一个int*p,而p指向一个动态开辟的空间,这时候用系统提供的拷贝构造、赋值运算符重载,就会导致一个指针变量的值赋值给另一个指针变量,相当于两个指针变量指向同一块空间,那么当一个对象要销毁时会调用析构函数来释放这块空间,那么此时另一个对象的这个指针就称为野指针,但是这个对象并不知道,当它也尝试去释放这块空间时,就会崩溃(这也就是为什么同一块空间不能释放两次的原因)。

针对以上“浅拷贝”的问题,我们的解决方案有两个:

(1)第一就是“深拷贝” 。即我不直接拷贝你的值,而是我看你的指针指向的空间有多大,我也开一块和你一样大的空间,并且把你的内容也拷过来,这样将来我们释放的时候,就会自己释放自己的,不会出现一块空间释放两次的后果。(深拷贝有两种写法,具体下面有)

(2)引用计数的“浅拷贝”。也称为“写时拷贝”。也就是说,我还是拷贝的是你的值,因为我们还是共享同一块空间,但是我在这块空间上添加一个计数器,记录着当前有多少个对象共享着我,当有一个对象析构时就将这个计数器减1,并判断自己是不是这块空间的最后一个引用着,如果不是就不管释放的操作,只有当自己是当前这块空间的唯一使用者,离开之前才释放这块空间,这样也会避免浅拷贝的多次释放问题。那么“写时拷贝”体现在哪里?由于以上过程的实质还是多个对象共享同一块空间,那么问题来了,当我一个对象想对这块空间做出修改时,影响到另一个对象咋办,这里“写时拷贝”的做法就是,在所有可能做出修改的地方都要独立出来一份属于自己的东西(即新拷一份空间,做到我的修改不影响其他人)。

string类对象的容量操作:

(1)size_t size()const 返回字符串的有效字符长度.这里的const修饰的是this指针指向的内容,即不可以通过this指针修改对象。与这个函数相同功能的函数是 size_t length()const.它存在的原因是兼容以前的版本。

(2)size_t capacity()const 返回总空间的大小(容量大小)。

(3)bool empty()const 判断是否为空串(即有效元素个数size是否为0)

(4)void clear() 清空有效字符(将有效字符个数size变为0,但是并不改变容量大小)

(5)resize(size_t n, char c) 将有效字符个数size改为n,当n大于原来的有效字符个数时,其余的空间用字符c填充。注意这里如果n很大,以至于比原来空间的容量还要大,是会增容的,即会改变capacity的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值