C ++ | char * Diseño basado en una clase string MiCadena

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:

 

Supongo que te gusta

Origin www.cnblogs.com/tedukuri/p/12566690.html
Recomendado
Clasificación