一个自己实现的string
最近实现了一个string类,添加了一些c++11元素。
除了基本的构造析构函数,拷贝构造和赋值函数,另外添加移动拷贝和赋值函数。default是一个很方便的特性有木有。
//default constructor
KianString()=default; KianString(const char *c): ch_() {
ch_ = (char*)malloc(sizeof(char)*(strlen(c)+));
strncpy(ch_, c, strlen(c)+);
}; ~KianString(){
free(ch_);
} //copy constructor
KianString(const KianString &str){
ch_ = (char*)malloc(sizeof(char)*(str.size()+));
strncpy(ch_, str.ch_, str.size()+);
} //assign operator, is ok for both lvalue and rvalue!
KianString &operator=(KianString str) noexcept {
swap(*this, str);
return *this;
} //move constructor
KianString(KianString &&str) noexcept : ch_(str.ch_) {
str.ch_ = NULL;
}
赋值拷贝采用了copy and swap idiom:
inline void swap(KianString &str1, KianString &str2){
using std::swap;
swap(str1.ch, str2.ch);
}
//assign operator, is ok for both lvalue and rvalue!
KianString &operator=(KianString str) noexcept {
swap(*this, str);
return *this;
}
这样做有几个好处:
1.参数是传值调用,可以同时使用左值和右值,使用右值时自动调用移动拷贝函数
2.强异常安全的,异常只会发生在参数拷贝时,如果发生异常,不会影响this。
3.值传递产生副本,所以自赋值也是正确的.
加法运算符重载:
KianString &operator+=(const KianString &str){
ch = (char*)realloc(ch, strlen(ch)+str.size()+);
strcat(ch, str.ch);
return *this;
}
template<typename T>
const T operator+(const T& lhs, const T& rhs) {
return T(lhs) += rhs;
}
1. 按照《c++编程规范》第27条,实现+运算符,先要实现+=,语义一致,便于维护
2. 将operator+定义为非成员函数,能够同时接受左右参数的隐式转换, 因为operator+=是public,所以operator+不需要设成friend。
3. 将operator+定义为template。
code:
https://github.com/coderkian/kianstring
一个自己实现的string的更多相关文章
- encode_json 会对给定的Perl的数据结构转换为一个UTF-8 encoded, binary string.
use JSON qw/encode_json decode_json/ ; use Encode; my $data = [ { 'name' => 'Ken' , 'age' => 1 ...
- string与int的相互转换以及把一个字符加入到string的末尾
#include "stdafx.h" #include<sstream> #include<string> #include<iostream> ...
- 调试接口,返回的json数据,我定义了一个类,用来序列化,其中有一个字段定义为string 然后序列化的时候报错
调试接口,返回的json数据,我定义了一个类,用来序列化,其中有一个字段定义为string 然后序列化的时候报错 在需要解析的类型类上加上声明 eg:
- c和c++如何把一个整数转化为string
c和c++如何把一个整数转化为string C++: 一.string转int的方式 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 采用标 ...
- 如何判断/检查一个集合(List<string>)中是否有重复的元素
问题描述 在.NET/C#应用程序编程开发中,如何判断一个字符串集合List<string>中是否有重复的元素? 假如有如下的List<string>集合: var lstNa ...
- MVC3的一个意外的异常 String was not recognized as a valid Boolean. @using (Html.BeginForm())
客户的网站放在一个虚拟空间,之间都没有修改过程序.可是网站的后台登录页面报错 String was not recognized as a valid Boolean. ,错误指向@using (H ...
- c++实现一个比较两个string类型的版本号的小demo
在软件实现更新模块的时候,有可能会判断一下服务器上的版本的版本号和本地版本的版本号. 下面有类似这样形式的版本号:string str = "0.0.0.1"; 分析一下可以看出, ...
- 一个简单实现的string类
为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...
- Folly解读(零) Fbstring—— 一个完美替代std::string的库
string 常见的三种实现方式 eager copy COW SSO Fbstring 介绍 Storage strategies Implementation highlights Benchma ...
随机推荐
- 将宿主主机上的目录挂载到Docker中
docker run -it -v /home/zhouqun/文档/workplace:/var/www/html ubuntu64 /bin/bash 将宿主主机中/home/文档/workpla ...
- Dubbo实践(一)入门示例
dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候 ...
- (转)查看mysql数据库连接数、并发数相关信息
查看mysql数据库连接数.并发数相关信息 1.mysql> show status like 'Threads%';+-------------------+-------+| Variabl ...
- C/S模式,发布/订阅模式和PUSH/PULL模式(上)
CS模式(客户端/服务器模式) 最场景的信息传递模式,也称为Request/Response模式,或者调用模式.http/https协议即此模式.因为最常用所以大家一般都比较熟悉,这里不重点讲了,大家 ...
- code#5 P3 我有矩阵,你有吗?
我有矩阵,你有吗? 时间限制: 1.0 秒 空间限制: 128 MB 相关文件: 题目目录 题目描述 企鹅豆豆手里有两个 01 矩阵 A 和 B.他可以进行两种操作: 选择 A 矩阵的一行,然后把 ...
- linux 学习第十一天
一.配置服务说明 1.1.linux系统中的一切都是文件 1.2.配置一个服务就是在修改去配置文件 1.3.要想让新的配置文件立即生效,需要重启对应的服务 二.配置网卡 2.1.编辑配置文件 vim ...
- html input file accept
*.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video*.ac3 audio/ac3 AC3 Audio*.asf allpication/vnd.ms-asf ...
- 用户从地址栏输入url,按下enter键后,直到页面加载完成的这个过程都发生了什么?
流程大概描述一下: 用户将url输入后,服务器接受到请求,然后将这个请求进行处理,然后将处理后的结果返回给浏览器,浏览器将该结果以页面的形式呈现给用户. 详细描述: 1:用户将url(例如www.ba ...
- Quick find Helper
using System; using Microsoft.Xrm.Sdk; using Microsoft.Crm.Sdk.Messages; /// <summary> /// 视图 ...
- 关于python文件问题
一.python内部的首行命令 #!/usr/bin/env python #_*_coding:utf8_*_ 第一条命令用于Linux系统中的./命令,用于声明用什么Python解释器.第二条命令 ...