Título del lenguaje de programación C ++ (cuarta edición) Autor Zheng Li Ejercicios 6-24
Aquí está el código basado en char * aplicación:
/ * * @Author: Hellcat * @Date: 03/24/2020 11:44:47 * Este archivo es MyString.h * / // clase con miembros puntero必须有copia ctor (拷贝构造)和copia op = (拷贝复制) #ifndef __MyString__ #define __MyString__ #include <iostream> #include <stdio.h> #include <string.h> using namespace std; MiCadena clase { público: MiCadena (const char * cstr = nullptr); MyString (const MyString y str); MyString operador & = (const MyString y str); MyString operador & + = (const MyString y str); MyString operador + (const MyString y str); int longitud (); ~ MyString (); char * c_str () const {M_DATA retorno; privada: char * M_DATA; amigo ostream operador & << (ostream & os, MiCadena const y str); amigo istream operador & >> (istream y es, MiCadena y str); };
archivo de implementación de la clase:
inline MiCadena :: MiCadena (const char * cstr / * = nullptr * /) {// argumento por defecto sólo en la primaria SI (CSTR = nullptr una!) { M_DATA = new new char [strlen (CSTR) + 1.]; // + 1 asignación '\ 0' strcpy (M_DATA, CSTR); } el {// Sin valor inicial cosa especifica M_DATA = new new char [1]; * M_DATA = '\ 0'; } } en línea MiCadena :: MiCadena (const y MiCadena STR) {// copia profunda M_DATA = new nuevo char [strlen (str.m_data) + 1.]; strcpy (M_DATA, str.m_data); } inline MyString :: MyString operador & = (const y MyString STR) { IF (el este == y STR) // detectado asignación a la libre devolver el este *; delete [] M_DATA; M_DATA = new nuevo char [strlen (str.m_data) + 1.]; strcpy (M_DATA, str.m_data); * volver esto; } //返回局部对象不能recurrencia de referencia en línea MiCadena MiCadena :: operador + (const MiCadena y str) { res mystring; res.m_data = new char [strlen (this-> M_DATA) + strlen (str.m_data) + 1]; strcpy (res.m_data, this-> M_DATA); strcat (res.m_data, str.m_data); res regresar; } Línea MiCadena y MiCadena :: operador + = (const MiCadena y str) { si (== str.m_data nullptr || * str.m_data == '\ 0') de retorno * esto; si (esto == y str) {//检测自我+ = temp MyString (* this); volver * + = esta temperatura; } Int len = strlen (M_DATA) + strlen (str.m_data) + 1; char * ptr = M_DATA; M_DATA = new char [len]; strcpy (M_DATA, ptr); str. strcat (M_DATA, str.m_data); * volver esto; //或者也可以用前面写的和+ =重载 // * = * este esta + str; // retorno * esto; } Operador bool inline <= (MyString y str1 const, MyString const y str2) { strcmp retorno (str1.c_str (), str2.c_str ()) <= 0; } // matriz nueva con delete tabla MiCadena línea :: ~ MiCadena () { delete [] M_DATA; } Ostream operador & << (ostream & os, MiCadena const y str) { os retorno << str.c_str (); } Istream operador & >> (istream y es, MyString y str) { temp char [1010]; si (es >> temp) { delete [] str.m_data; strcpy (str.m_data, temp); } Retorno es; inline int MiCadena :: longitud () { retorno strlen (this-> M_DATA); }
Código de ensayo:
// test135.cpp # include "MyString.h" prueba de vacío en línea (const char * título, valor bool) { cout << << título "retornos" << (valor "verdadero": "false") << endl ; } Int main () { MyString s1 = "DEF"; tribunal << "s1 es" << s1 << endl; MyString s2; tribunal << "Por favor, introduzca s2:"; cin >> s2; cout << "longitud de s2:" << s2.length () << endl; //测试比较运算符 de prueba ( "s1 <= \" ABC \ "", s1 <= "ABC"); de prueba ( "\" DEF \ "<= s1", "DEF" <= s1); //测试连接运算符 s2 + = s1; cout << "s2 = s2 + s1:" << s2 << endl; cout << "longitud de s2:" << s2.length () << endl; return 0; }
El resultado: