程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 一個自己實現的string

一個自己實現的string

編輯:C++入門知識

最近實現了一個string類,添加了一些c++11元素。

除了基本的構造析構函數,拷貝構造和賦值函數,另外添加移動拷貝和賦值函數。default是一個很方便的特性有木有。

 //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;
} 

 

賦值拷貝采用了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()+1);
  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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved