• mystring c++ 自己的string 封装



    1
    /************************************************************************* 2 > File Name: mystring.h 3 > Author: lukey 4 > Mail: lukey123@foxmail.com 5 > Created Time: Wed 17 Jun 2015 08:50:49 PM CST 6 ************************************************************************/ 7 8 #ifndef __MYSTRING__ 9 #define __MYSTRING__ 10 11 class String 12 { 13 public: 14 String(); 15 String(const char *);//有参构造函数 16 String(const String & rhs); //复制构造 17 ~String(); 18 19 String & operator=(const String & rhs);//赋值运算符的两种情况 20 String & operator=(const char *str); 21 22 String & operator+=(const String & rhs); 23 String & operator+=(const char * str); 24 25 char & operator[](std::size_t index); 26 const char & operator[](std::size_t index) const; 27 28 std::size_t size() const; 29 const char* c_str() const; 30 void debug(); 31 32 //String 类和char相加的几个情况 33 friend String operator+(const String & s1, const String & s2); 34 friend String operator+(const String &, const char *); 35 friend String operator+(const char *, const String &); 36 37 friend bool operator==(const String &, const String &); 38 friend bool operator!=(const String &, const String &); 39 40 friend bool operator<(const String &, const String &); 41 friend bool operator>(const String &, const String &); 42 friend bool operator<=(const String &, const String &); 43 friend bool operator>=(const String &, const String &); 44 45 friend std::ostream & operator<<(std::ostream & os, const String &s); 46 friend std::istream & operator>>(std::istream & is, String & s); 47 48 private: 49 char *pstr_; 50 }; 51 52 #endif
      1 /*************************************************************************
      2   > File Name: mystring.cc
      3   > Author: lukey
      4   > Mail: lukey123@foxmail.com 
      5   > Created Time: Wed 17 Jun 2015 09:18:55 PM CST
      6  ************************************************************************/
      7 
      8 #include<iostream>
      9 #include<cstring>
     10 #include<stdlib.h>
     11 #include"mystring.h"
     12 using namespace std;
     13 #if 0
     14 class String
     15 {
     16     public:
     17     private:
     18         char *pstr_;
     19 };
     20 #endif
     21 
     22 //构造函数
     23 String::String()
     24 {
     25     std::cout << "String()" << std::endl;
     26     pstr_  = new char[1];//new 已经初始化了
     27 }
     28 String::String(const char *str)//有参构造函数
     29 {
     30     std::cout << "String(const char * str)" << std::endl;
     31     pstr_ = new char[strlen(str)+1];
     32     strcpy(pstr_, str);
     33 }
     34 String::String(const String & rhs)    //复制构造,考虑自复制情况?
     35 {
     36     std::cout << "String(const String & rhs)" << std::endl;
     37     pstr_ = new char[strlen(rhs.pstr_) + 1];
     38     strcpy(pstr_, rhs.pstr_);
     39 }
     40 String::~String()
     41 {
     42     std::cout << "~String()" << std::endl;
     43     delete []pstr_;
     44 }
     45 
     46 String & String::operator=(const String & rhs)//赋值运算符的两种情况,考虑自赋值情况
     47 {
     48     std::cout << "String & operator=(const String & rhs)" << std::endl;
     49     if(this == &rhs)
     50         return *this;
     51     delete []pstr_;
     52     pstr_ = new char[strlen(rhs.pstr_) + 1];
     53     strcpy(pstr_, rhs.pstr_);
     54     return *this;
     55 }
     56 String & String::operator=(const char *str)
     57 {
     58     std::cout << "String & operator=(const char *str)" << std::endl;
     59     pstr_ = new char[strlen(str) + 1];
     60     strcpy(pstr_, str);
     61     return *this;
     62 }
     63 
     64 String & String::operator+=(const String & rhs)    //rhs连接到pstr_后面
     65 {
     66     std::cout << "operator+=(const String & rhs)" << std::endl;
     67     int len = strlen(rhs.pstr_) + strlen(pstr_);
     68     pstr_ = (char *)realloc(pstr_, len + 1);
     69     strcat(pstr_, rhs.pstr_);
     70     return *this;
     71 }
     72 String & String::operator+=(const char * str)
     73 {
     74     std::cout << "operator+=(const char * str)" << std::endl;
     75     int len = strlen(str) + strlen(pstr_);
     76     pstr_ = (char *)realloc(pstr_, len + 1);
     77     strcat(pstr_, str);
     78     return *this;
     79 }
     80 
     81 //下标运算符,非常量,可以修改值
     82 char & String::operator[](std::size_t index)
     83 {
     84     return pstr_[index];
     85 }
     86 
     87 //常量对象取下标,不能为其赋值
     88 const char & String::operator[](std::size_t index) const
     89 {
     90     return pstr_[index];
     91 }
     92 
     93 //字符串容量
     94 std::size_t String::size() const
     95 {
     96     return strlen(pstr_);
     97 }
     98 
     99 //转换成c类型字符串,以''结尾
    100 const char* String::c_str() const
    101 {
    102     int len = strlen(pstr_);
    103 
    104     pstr_[len + 1] = '';
    105     return pstr_;
    106 }
    107 
    108 //不懂?打印出字符串?
    109 void String::debug()
    110 {
    111     std::cout << pstr_ << std::endl;    
    112 }
    113 
    114 String operator+(const String & s1, const String & s2)
    115 {
    116     std::cout << "operator+(const String & s1,const String & s2)" << std::endl;
    117     String ret_str = s1.pstr_;
    118     ret_str += s2.pstr_;
    119     return ret_str;
    120 }
    121 
    122 String operator+(const String & s, const char * str)
    123 {
    124     std::cout << "operator+(String, char *)" << std::endl;
    125     String temp(str);
    126     return (s + temp);    //直接调用上面的(+)函数
    127 
    128 }
    129 
    130 String operator+(const char * str, const String & s)
    131 {
    132     std::cout << "operator+( char *, String)" << std::endl;
    133     String temp(str);
    134     return (s + temp);    //直接调用上面的(+)函数
    135 }
    136 
    137 bool operator==(const String & lstr, const String & rstr)
    138 {
    139     std::cout << "==" << std::endl;
    140     if(strcmp(lstr.pstr_, rstr.pstr_) == 0)
    141         return true;
    142     else
    143         return false;
    144 }
    145 
    146 bool operator!=(const String & lstr, const String & rstr)
    147 {
    148     std::cout << "!=" << std::endl;
    149     return !(lstr == rstr);
    150 }
    151 
    152 bool operator<(const String & lstr, const String & rstr)
    153 {
    154     std::cout << "<" << std::endl;
    155     if(strcmp(lstr.pstr_, rstr.pstr_) < 0)
    156         return true;
    157     else
    158         return false;
    159 }
    160 
    161 bool operator>(const String & lstr, const String & rstr)
    162 {
    163     std::cout << ">" << std::endl;
    164     if(strcmp(lstr.pstr_, rstr.pstr_) > 0)
    165         return true;
    166     else
    167         return false;
    168 }
    169 bool operator<=(const String & lstr, const String & rstr)
    170 {
    171     std::cout << "<=" << std::endl;
    172     if(strcmp(lstr.pstr_, rstr.pstr_) <= 0)
    173         return true;
    174     else
    175         return false;
    176 }
    177 
    178 bool operator>=(const String & lstr, const String & rstr)
    179 {
    180     std::cout << ">=" << std::endl;
    181     if(strcmp(lstr.pstr_, rstr.pstr_) >= 0)
    182         return true;
    183     else
    184         return false;
    185 }
    186 
    187 std::ostream & operator<<(std::ostream & os, const String &s)
    188 {
    189     os << s.pstr_ << " ";
    190     return os;
    191 }
    192 std::istream & operator>>(std::istream & is, String & s)
    193 {
    194     is >> s.pstr_;
    195     return is;        //貌似有坑, 目前不能输入空格
    196 }
    197 
    198 
    199 //测试时每个函数调用都打印了信息
    200 int main(void)
    201 {
    202     String s1("hello");
    203     s1.debug();
    204     std::cout << s1;
    205     std::cout << std::endl;
    206     String s2("world");
    207     s2.debug();
    208     if(s1 > s2)
    209         std::cout << "s1 > s2" << std::endl;
    210 
    211     s1 = s2;
    212     s1.debug();
    213     String s3(s1);
    214     s3.debug();
    215 
    216     String s4 = s2 + s3;
    217     s4.debug();
    218 
    219     String s5;
    220     std::cout << s5 << std::endl;
    221     std::cin >> s5;
    222     std::cout << s5 << std::endl;
    223     return 0;
    224 }
  • 相关阅读:
    结对项目开始
    团队项目开始
    个人项目总结
    python面向对象
    OSI七层模型
    Django中的orm的惰性机制
    Python装饰器
    python运算符
    python元祖和列表
    Sencha Touch 1.x 快速入门 第三章 布局(2) Card布局
  • 原文地址:https://www.cnblogs.com/luolizhi/p/4584657.html
Copyright © 2020-2023  润新知