自己动手写string类(一)

         前面说到了string类,为什么她就能够那么方便呢? 其实这是有原因的,因为它的背后有很多愿意默默奉献的英雄们在大力支持~~~今天就让我们来初窥其神秘的面纱(其实也只是冰山一角)! !

         我们都知道string对象可以直接进行输入,输出,赋值,相加,比较等等,其实说到底就是string类中对大量的运算符进行了重载。那什么是运算符重载呢? 这个是C++重要的一部分内容,今天就一起来探讨探讨!!

        我对运算符重载的理解简单说是这样的,对已有的运算符重新定义,使得满足我们使用的要求。(具体的请参考C++有关教材)。下面我们就直接自己动手写string类了。。。。

 

        常见的创建对象的方法有String str; 或者 String str("i love C++"); 创建对象时就必须调用构造函数,所以这里可以通过默认构造函数来构造一个空字符串,同时也应该有一个带参数的构造函数。-----这里为了区别string类,就用String作为类名。

 

         class String{

                    char *str ;    //指向字符串的指针
                     int len;        //记录字符串的长度

        public:
                    String(){         //创建无参对象时调用
                         len = 0;                        
                         str = new char[1];        //动态申请一个char大小的内存空间
                         str[0] = '\0';                  //表示字符串为空
                   }


                   String(const char* const str){         //创建带参数的对象时调用
                          len = strlen(str);                      //取得字符串的长度
                          this->str = new char[len+1];   //动态申请长度+1大小的内存空间,并把char数组的内存地址赋给str

                          for(int i=0; i<len; i++)             //用传过来的字符串初始化
                                  this->str[i] = str[i];          //这里会对数组越界进行检验(见下面)
                         this->str[len] = '\0';                 //
因为是数组,'\0'为结束标志


                   }

       };

 

       接下来可以开始运算符重载了。。。

       编译器没有对数组越界的问题进行善意的提醒,所以我们可以自己来给自己进行安全的检验。所以选择了重载[ ]。

        char& operator[](unsigned int len)        //len作为数组的下标
       {
                 if(len > this->len)
                       return str[this->len-1];         //如果下标超过了数组长度,那么返回数组最后一个可见字符
                else
                       return str[len];                    //否则返回该下标的数组元素
       }

 

       同时可以对这个函数进行重载,对const对象也可以进行操作

       char  operator[](unsigned int len) const        //len作为数组的下标
       {
                 if(len > this->len)
                       return str[this->len-1];         //如果下标超过了数组长度,那么返回数组最后一个可见字符
                else
                       return str[len];                    //否则返回该下标的数组元素
       }

      

       输出<<运算符 和 重载输入>>

      对于对象可以直接这样输出cout<<str; 是因为重载了operator<< 。

       friend ostream& operator<<(ostream& os, const String& s)     // 固定格式 ,参数类型要对应cout是ostream对象
      {
                 os<<s;
                 return os;                              //返回ostream对象,为的是可以进行连续的输出 如cout<<str1<<str2;
      }  

        

         重载输入>> 与上面类似。。。

         friend istream& operator>>(istream& is, String& s)   
       {
                 is>>s;
                 return is;
        }

 

        为了能够简单的对两个对象进行赋值,如 str1 = str2 ;  必须重载赋值 = 运算符。。。

        String& operator=(const String& s)       
       {
               if(this == &s)               //如果字符串相同,返回当前对象
                      return *this;
              delete []str;                 //否则,释放当前对象内存空间
             len = s.getlen();          
             str = new char[len+1];  //重新申请内存空间
             for(int i=0; i<len; i++)   //把字符串s保存在str所指向的空间
                     str[i] = s[i];
             str[i] = '\0';

                     return *this;              
       }

 

       未完待续。。。。。

      

        

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值