zoukankan      html  css  js  c++  java
  • 字符串类创建(下)

     有两个版本,const版本和非const版本。非const版本是给没有被const关键字修饰的对象使用的,const版本是给被const关键字修饰的常对象使用的。

    String.h

     char& operator[](int i);
     char operator[](int i) const;

    String.cpp

    char& String::operator [] (int i)  //给非const对象使用,因此返回引用。引用意味着可以被赋值,可以出现在赋值符号的左边
    {
        if((0<=i) && (i<m_length))
        {
            return m_str[i];
        }
        else
        {
            THROW_EXCEPTION(IndexOutOfBoundsException,"parameter i is invalid...");
        }
    }
    
    char String::operator[] (int i) const
    {
        //将当前对象的只读属性去掉,从而可以调用上面实现的非const版本,实现代码的复用。
       return(const_cast<String&>(*this))[i];
    }

     Strng.h

     bool equal(const char* l,const char* r, int len) const; //l r表示字符数组的首地址
     bool startWith(const char* s) const;
     bool startWith(const String& s) const;
     bool endOf(const char* s) const;
     bool endOf(const String& s) const;

    String.cpp

    bool String::equal(const char *l, const char *r, int len) const
    {
        bool ret = true;
    
        for(int i=0; i<len && ret; i++)
        {
            ret = ret && (l[i] == r[i]);
        }
    
        return ret;
    }
    bool String::startWith(const char *s) const
    {
        bool ret = (s != NULL);
        if(ret)
        {
            /*
            *在比对之前,首先要判断一下s与字符串对象中的字符串的长度大小。
            * 合法情况:s的字符串长度小于字符串对象中字符串的长度
            */
            int len = strlen(s);
            ret = (len < m_length) && (equal(m_str,s,len));
        }
    
        return ret;
    }
    
    bool String::startWith(const String &s) const
    {
        return startWith(s.m_str);
    }
    
    bool String::endOf(const char *s) const
    {
        bool ret = (s != NULL);
        if(ret)
        {
            /*
            *在比对之前,首先要判断一下s与字符串对象中的字符串的长度大小。
            * 合法情况:s的字符串长度小于字符串对象中字符串的长度
            */
            int len = strlen(s);
            //需要定位到最后几个字符的起始位置,最后的这几个字符是由s决定的
            char* str = m_str + (m_length - len);
            ret = (len < m_length) && (equal(str,s,len));
        }
    
        return ret;
    }
    
    bool String::endOf(const String &s) const
    {
        return endOf(s.m_str);
    }

    main.cpp

    int main()
    {
        String s = "jackson is handsome";
    
        cout << s.startWith("jac") << endl;
        cout << s.endOf("handsome") << endl;
    
        for(int i=0; i<s.length(); i++)
        {
            cout << s[i] << endl;
        }
        return 0;
    }

     String.h

    String& insert(int i, const char* s);
    String& insert(int i, const String& s);

    String.cpp

    /*返回引用就是为了实现链式操作*/
    String& String::insert(int i,const char* s)
    {
        if((0<=i) && (i<=m_length))
        {
            if((s != NULL) && (s[i] != ''))
            {
                int len = strlen(s);
                char* str = reinterpret_cast<char*>(malloc(len + m_length + 1));
                if(str)
                {
                    strncpy(str,m_str,i);
                    strncpy(str + i,s,len);
                    strncpy(str + i + len,m_str + i,m_length - i);
                    //不要忘记加上字符串的结束标志
                    str[m_length + len] = '';
                    //更新字符串类中成员变量的状态
                    free(m_str);
                    m_str = str;
                    m_length = m_length + len;
                }
                else
                {
                    THROW_EXCEPTION(NoEnoughMemoryException,"no enough memory to allocate...");
                }
            }
        }
        else
        {
            THROW_EXCEPTION(IndexOutOfBoundsException,"parameter is is invalid...");
        }
    }
    
    String& String::insert(int i, const String &s)
    {
        return insert(i,s.m_str);
    }

    main.cpp

    int main()
    {
        String s = " ";
        s.insert(0, "jackson");
        s.insert(7," is bsp software engineer in ZTE!");
        cout << s.str() << endl;
        return 0;
    }

     String.h

    String& trim();

    String.cpp

    String& String::trim()
    {
        int b = 0;
        int e = m_length - 1;
    
        while(m_str[b] == ' ') b++;
        while(m_str[e] == ' ') e--;
    
        if(b == 0)
        {
            m_str[e + 1] = '';
            m_length = e + 1; //字符串中最后一个元素的下标为e,从下标0到e,共有e+1个元素。
        }
        else
        {
            for(int i=0 ,j=b; j<=e; j++, i++)
            {
                m_str[i] = m_str[j];
            }
            m_str[e - b + 1] = '';
            m_length = e - b + 1;
        }
    
        return *this;
    }

    main.cpp

    int main()
    {
        String s = " jackson  ";
        //这个地方先trim,然后返回s自己,然后再打印。这就体现了链式操作
        cout << s.trim().str() << endl;
    
        if(s.trim().insert(0,"goer").endOf("son") && s.startWith("goer"))
        {
            cout << s.str() << endl;
        }
        return 0;
    }
  • 相关阅读:
    查看linux cpu和内存利用率__linux - top命令
    Maven仓库管理Nexus(转帖后加强版)
    实现系统菜单的两种方式
    使用Iterator遍历数组
    Android自定义退出弹出框
    AsyncTask的学习
    Android中常用到的权限
    Java集合
    Android中以文件的形式保存数据
    Android仿微信的开机滑动界面
  • 原文地址:https://www.cnblogs.com/-glb/p/13283134.html
Copyright © 2011-2022 走看看