最近实现了一个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的更多相关文章

  1. encode_json 会对给定的Perl的数据结构转换为一个UTF-8 encoded, binary string.

    use JSON qw/encode_json decode_json/ ; use Encode; my $data = [ { 'name' => 'Ken' , 'age' => 1 ...

  2. string与int的相互转换以及把一个字符加入到string的末尾

    #include "stdafx.h" #include<sstream> #include<string> #include<iostream> ...

  3. 调试接口,返回的json数据,我定义了一个类,用来序列化,其中有一个字段定义为string 然后序列化的时候报错

    调试接口,返回的json数据,我定义了一个类,用来序列化,其中有一个字段定义为string 然后序列化的时候报错 在需要解析的类型类上加上声明 eg:

  4. c和c++如何把一个整数转化为string

    c和c++如何把一个整数转化为string C++: 一.string转int的方式 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了. 采用标 ...

  5. 如何判断/检查一个集合(List<string>)中是否有重复的元素

    问题描述 在.NET/C#应用程序编程开发中,如何判断一个字符串集合List<string>中是否有重复的元素? 假如有如下的List<string>集合: var lstNa ...

  6. MVC3的一个意外的异常 String was not recognized as a valid Boolean. @using (Html.BeginForm())

    客户的网站放在一个虚拟空间,之间都没有修改过程序.可是网站的后台登录页面报错  String was not recognized as a valid Boolean. ,错误指向@using (H ...

  7. c++实现一个比较两个string类型的版本号的小demo

    在软件实现更新模块的时候,有可能会判断一下服务器上的版本的版本号和本地版本的版本号. 下面有类似这样形式的版本号:string str = "0.0.0.1"; 分析一下可以看出, ...

  8. 一个简单实现的string类

    为了复习c++知识,简单的实现一个string类,类名为CMyString 环境说明:windows 7 64位 和 CentOS Linux release 7.6.1810 (Core) 开发工具 ...

  9. Folly解读(零) Fbstring—— 一个完美替代std::string的库

    string 常见的三种实现方式 eager copy COW SSO Fbstring 介绍 Storage strategies Implementation highlights Benchma ...

随机推荐

  1. JAVA语言编程思维入门

    Java语言是一门强数据类型语言,也就是所有的数据有自己的数据类型,不能搞混淆.比如整数int 字符串String 不能用int a="字符串123";这样写是错的,因为数据类型不 ...

  2. 2017年秋招美团Java程序员开发,看我如何拿到offer

    本人是一名本科毕业非计算机专业的程序员,面了阿里,结果没过,最后面上了美团,热乎乎的面经,昨天面的美团,虽然面完了HR面,但是感觉希望不大,希望能走运拿到offer吧.记性不是太好,有一些问题没能记住 ...

  3. Java 8-Stream流

    出处:Java 8 中的 Stream API详解 什么是流 Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator.原始版本的 Iter ...

  4. ES6中let与const命令详解

    阮一峰ES6入门 let 作用域 let命令用来声明变量,但声明的变量只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: ...

  5. Ubuntu下VsCode+CMake 交叉编译

    在安装配置好VsCode后,下载相关插件.如图: 其中CMake Tools是为了方便使用CMake的扩展工具. 在创建工程前,先在VSCode打开一个空的目录(你的Project目录),再对CMak ...

  6. ERP系统和MES系统的区别

    公司说最近要上一套erp系统,说让我比较一下,erp系统哪个好,还有mes系统,我们适合上哪个系统,其实我还真的不太懂,刚接触erp跟mes的时候,对于两者的概念总是傻傻分不清楚,总是觉得既然都是为企 ...

  7. MySQL数据库的隔离级别之可重复读为什么能够有效防止幻读现象的出现

    可重复读隔离级别,不允许存在幻读,该隔离级别之所以能够有效防止幻读现象的出现,是因为可重复读这个隔离级别有用到GAP锁(间隙锁).下面我们以解析SQL语句为切入点,来解释个中原因. 前提条件:①数据库 ...

  8. php以数组做为配置文件的读取和写入操作

    最近想用php开发个简单的文章管理系统,主要是做一批垃圾采集站,目前网上的cms都太多功能了,导致修改个模板要很多文件,花费很多功夫.开始用thinkphp框架做,感觉还是麻烦,后来改用ci,做好了后 ...

  9. Java实例 Part3:流程控制

    目录 Example01:判断某一年是否为闰年 Example02:验证登录信息的合法性 Example03:判断用户输入月份的季节 Example04:使用while循环语句与自增运算符循环遍历数组 ...

  10. Flink-on-yarn

    介绍 官网下载 https://www.apache.org/dyn/closer.lua/flink/flink-1.6.1/flink-1.6.1-bin-hadoop28-scala_2.11. ...