string实现C++
来源:互联网 发布:口腔医学专升本知乎 编辑:程序博客网 时间:2024/06/05 06:51
#include <iostream>class String{public: String(); String(char c, int n); String(const char* c_str); String(const String& other); String& operator=(const String& other); String& operator=(const char* c_str); ~String(); String& operator+=(const String& other); String& operator+=(const char* c_str); char& operator[](int i)const;/*1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;3)友元函数不能直接访问类的成员,只能访问对象成员,4)友元函数可以访问对象的私有成员,但普通函数不行;5)调用友元函数时,在实际参数中需要指出要访问的对象,6)类与类之间的友元关系不能继承。7)一个类的成员函数也可以作为另一个类的友元,但必须先定义这个类。*/ friend std::ostream& operator<<(std::ostream& out, const String& other); friend std::istream& operator>>(std::istream& in, const String& other); //friend bool operator<(const String& left, const String& right); //friend bool operator>(const String& left, const String& right); //friend bool operator==(const String& left, const String& right); //friend bool operator!=(const String& left, const String& right); void print()const; int length()const; char& back(); char& front(); void append(const String& str); void insert(int pos,const String& str); void earse(int index); void earse(char c); void replace(char oldch,char newch); char* c_str()const;private: char* m_data; int m_size;};String::String(){ m_data = new char[1]; *m_data = '\0'; m_size = 0;}String::String(char c, int n){ m_data = new char[n + 1]; m_size = n; while (n > 0) { m_data[--n] = c; } m_data[m_size] = '\0';}String::String(const char* c_str){ if (c_str == NULL) { m_data = new char[1]; *m_data = '\0'; m_size = 0; } else { m_size = strlen(c_str); m_data = new char[m_size + 1]; strcpy_s(m_data, m_size+1, c_str); }}String::String(const String& other){ m_size = other.m_size; m_data = new char[m_size+ 1]; strcpy_s(m_data, m_size + 1, other.m_data);}String& String::operator=(const String& other){ if (this == &other) { return *this; } if (m_data != NULL) { delete[] m_data; } m_size = other.m_size; m_data = new char[m_size+1]; strcpy_s(m_data, m_size + 1, other.m_data); return *this;}String& String::operator=(const char* c_str){ if (c_str == NULL) { return *this; } if (m_data != NULL) { delete[] m_data; m_data = NULL; } m_size = strlen(c_str); m_data = new char[m_size + 1]; strcpy_s(m_data, m_size + 1, c_str); return *this;}char& String::operator[](int i)const{ if (i < m_size) { return m_data[i]; } return m_data[m_size];;}String& String::operator+=(const String& other){ m_size = strlen(other.m_data) + m_size; char* c_temp = m_data; m_data = NULL; m_data = new char[m_size+1]; strcpy_s(m_data, m_size + 1, c_temp); strcat_s(m_data, m_size + 1, other.m_data); delete[] c_temp; return *this;}String& String::operator+=(const char* c_str){ m_size = strlen(c_str) + m_size; char* c_temp = m_data; m_data = NULL; m_data = new char[m_size + 1]; strcpy_s(m_data, m_size + 1, c_temp); strcat_s(m_data, m_size + 1, c_str); delete[] c_temp; return *this;}String::~String(){ if (m_data != NULL) { delete[] m_data; m_data = NULL; m_size = 0; }}void String::print()const{ if (m_data != NULL) { std::cout << m_data << std::endl; }}int String::length()const{ return m_size;}std::ostream& operator<<(std::ostream& out, const String& other){ for (int i = 0; i < other.length(); i++) { out << other[i]; } return out;}//std::istream& operator>>(std::istream& in, const String& other)//bool operator<(const String& left, const String& right)//bool operator>(const String& left, const String& right)//bool operator==(const String& left, const String& right)//bool operator!=(const String& left, const String& right)char& String::back(){ if(m_size>0){ return m_data[m_size-1]; }else{ return m_data[0]; }}char& String::front(){ return m_data[0];}void String::append(const String& str){ m_size = str.m_size + m_size; char* c_temp = m_data; m_data = NULL; m_data = new char[m_size + 1]; strcpy_s(m_data, m_size + 1, c_temp); strcat_s(m_data, m_size + 1, str.m_data); delete[] c_temp;}void String::insert(int pos,const String& str){ if(pos < 0 || pos > m_size){ return ; } m_size += str.m_size; char* c_temp = m_data; m_data = NULL; m_data = new char[m_size + 1]; int i = 0; for(; i<pos;++i){ m_data[i] = c_temp[i]; } for(int j = 0;j < str.m_size;++j){ m_data[i++] = str[j]; } while(c_temp[pos] != '\0'){ m_data[i++] = c_temp[pos++]; } m_data[i] = '\0'; delete[] c_temp;}void String::earse(int index){ if(index < m_size){ char* p1 = m_data + index; char* p2 = p1 + 1; while(*p2 != '\0'){ *p1++ = *p2++; } *p1 = '\0'; m_size -= 1; }}void String::earse(char c){ char* p1 = m_data; char* p2 = m_data; while(*p1 != '\0'){ if(*p1 != c){ *p2++ = *p1++; }else{ ++p1; } } *p2 = '\0'; m_size = int(p2 - m_data);}void String::replace(char oldch,char newch){ for(int i = 0 ; i < m_size ; ++i){ if(m_data[i] == oldch){ m_data[i] = newch; } }}char* String::c_str()const{ return m_data;}int main(){ String str1('1', 9); String str2("12345"); std::cout << str1 << std::endl; str2.print(); str1 += "23454"; str1.print(); str1[5] = '9'; str1.print(); std::cout << str1[15] <<std::endl; str1.replace('4','A'); str1.print(); str1.earse('A'); str1.print(); str1.earse(0); str1.print(); str1.insert(0,"xiaolixi"); str1.print(); return 0;}
阅读全文
0 0
- C++,string实现
- 【C/C++】String类实现
- [C++]String类的实现
- [C++]String类的实现
- [C++]String类的实现
- C++String类的实现
- 【c++】string类的实现
- C string buffer的实现
- C++string类的实现
- C++:模拟实现string类
- C++string类的实现
- C++String类的实现
- 模拟实现string类(c++)
- C++string类的实现
- 【C++】模拟实现String类
- C/C++string类的实现
- 字符串函数实现---lib\string.c
- 【学习笔记】【C++】自己实现string类
- POJ 1905 Expanding Rods(二分)
- mapreduce web日志预处理
- LOJ #6077. 「2017 山东一轮集训 Day7」逆序对
- 202. Happy Number
- 73前序遍历和中序遍历树构造二叉树
- string实现C++
- 自己封装一个类借助实现数据库加载及夜间模式
- matlab之simulink学习(1、搭建一个简单系统)
- 一个fork的面试题
- java生成PDF文件
- tomcat webapps 目录下web工程只有目录,没有class文件
- jstree -- 使用JSON 数据组装成树
- 剑指offer-最小的K个数
- C++操作redis数据库