最近实现了一个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

最新文章

  1. PHP 多维数组 Key Value的使用
  2. scala 学习:object 和class, trait
  3. OpenWRT 路由配置技巧
  4. Linux fdisk命令参数及用法详解---Linux磁盘分区管理命令fdisk
  5. Swift - 数字格式化转成字符串(保留两位小数)
  6. Java中的statickeyword具体解释
  7. 项目分享:通过使用SSH框架的公司-学员关系管理系统(CRM)
  8. 收藏了4年的Android 源码分享
  9. 基于Spring注解搭建SpringMVC项目
  10. 6993: Dominoes(纯bfs)
  11. Nginx location配置详解
  12. 剑指Offer_编程题_4
  13. WebStorm记录(3)
  14. JavaWeb中过滤器Filter的使用示例
  15. super和this关键字
  16. SVN服务器多个项目的权限分组管理
  17. 深入浅出TCP之listen
  18. 共享内存system v(未编译)
  19. JAVAWEB servlet验证登录时进行完全的非空判断防止空值登录
  20. iOS获取设备卸载后不变的UUID

热门文章

  1. [Python 多线程] Concurrent (十五)
  2. Linux 问题处理集锦
  3. mongoDB的常用语法
  4. PHP面试系列 之Linux(三)---- Vi/Vim编辑器
  5. HDU 1272小希的迷宫(裸并查集,要判断是否构成环,是否是连通图)
  6. 基于MySql数据库的单表与多表联合查询
  7. Linux Shell常用技巧(十)
  8. Python基础 条件判断和循环
  9. 【PTA 天梯赛】L3-003 社交集群(并查集)
  10. shell习题第10题:打印每个单词的字数