首页 > 其他 > 详细

一个自己实现的string

时间:2014-05-12 01:12:38      阅读:400      评论:0      收藏:0      [点我收藏+]

最近实现了一个string类,添加了一些c++11元素。

除了基本的构造析构函数,拷贝构造和赋值函数,另外添加移动拷贝和赋值函数。default是一个很方便的特性有木有。

bubuko.com,布布扣
 //default constructor
KianString()=default;

KianString(const char *c): ch_(0) {
  ch_ = (char*)malloc(sizeof(char)*(strlen(c)+1));
  strncpy(ch_, c, strlen(c)+1);
};

~KianString(){
  free(ch_);
}

//copy constructor
KianString(const KianString &str){
  ch_ = (char*)malloc(sizeof(char)*(str.size()+1));
  strncpy(ch_, str.ch_, str.size()+1);
}

//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;
} 
bubuko.com,布布扣

 

赋值拷贝采用了copy and swap  idiom:

bubuko.com,布布扣
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;
} 
bubuko.com,布布扣

这样做有几个好处:

1.参数是传值调用,可以同时使用左值和右值,使用右值时自动调用移动拷贝函数

2.强异常安全的,异常只会发生在参数拷贝时,如果发生异常,不会影响this

3.值传递产生副本,所以自赋值也是正确的.

加法运算符重载:

bubuko.com,布布扣
KianString &operator+=(const KianString &str){
  ch = (char*)realloc(ch, strlen(ch)+str.size()+1);
  strcat(ch, str.ch);
  return *this;
}

template<typename T>
const T operator+(const T& lhs, const T& rhs) {
  return T(lhs) += rhs;    
}
bubuko.com,布布扣

 

1. 按照《c++编程规范》第27条,实现+运算符,先要实现+=,语义一致,便于维护

2. 将operator+定义为非成员函数,能够同时接受左右参数的隐式转换, 因为operator+=public,所以operator+不需要设成friend

3. 将operator+定义为template

 

code:

https://github.com/coderkian/kianstring

一个自己实现的string,布布扣,bubuko.com

一个自己实现的string

原文:http://www.cnblogs.com/coderkian/p/3721426.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!