简单string类实现一
今天编写一个简单的string类,结果错误百出,写出来警示一下自己,要多动手。。。。
要求:
编写类String 的构造函数、析构函数和赋值函数,已知类String 的原型为:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
我的代码:
#pragma once #include"iostream" using namespace std; class MyString { public: MyString(const char* str = NULL);//普通构造函数 MyString(const MyString& str);//拷贝构造函数 ~MyString(); MyString& operator=(const MyString& str); private: char *m_data; };
#define _CRT_SECURE_NO_WARNINGS #include "MyString.h" //MyString::MyString(const char* str = NULL)//error C2572:重定义默认参数 : 参数 1 MyString::MyString(const char* str) { cout << "putong" << endl; if (str == NULL) { m_data = new char[1];//对空字符串自动申请存放结束标志'\0'的空间 if (m_data == NULL)//内存是否申请成功 { cout << "内存分配失败" << endl; exit(1);//exit(0):正常运行程序并退出程序;exit(1):非正常运行导致退出程序; } //strcpy(m_data, '\0'); m_data[0] = '\0'; } else{ //m_data = new char[sizeof(str)+1]; m_data = new char[strlen(str) + 1]; if (m_data == NULL) { cout << "内存分配失败" << endl; exit(1); } strcpy(m_data, str); } } MyString::MyString(const MyString& str) { cout << "copy" << endl; /*if (*this == str) { return *this; }*/ //this->m_data = new char[sizeof(str.m_data)+1]; m_data = new char[strlen(str.m_data) + 1]; if (m_data == NULL) { cout << "内存分配失败" << endl; exit(1); } strcpy(this->m_data, str.m_data); } MyString& MyString::operator=(const MyString& str) { cout << "fuzhi" << endl; //if (*this == str) //error C2678 :没有与这些操作数匹配的"=="运算符(因为我们还没有重载运算符“==”) //{ //return *this; //} // if (this == &str) { return *this; } delete[] m_data;//释放原来的内存资源 //this->m_data = new char[sizeof(str.m_data)+1]; m_data = new char[strlen(str.m_data) + 1]; if (m_data == NULL) { cout << "内存分配失败" << endl; exit(1); } strcpy(this->m_data, str.m_data); return *this; } MyString::~MyString() { cout << "xiugou" << endl; }
#include"iostream" using namespace std; #include"MyString.h" void playstage() { //MyString a;//调用普通构造函数 MyString a = "hello";//调用普通构造函数 MyString b("woooo");//调用普通构造函数 } void main() { playstage(); system("pause"); }
错误百出啊!!!!!考虑的也不全面。。注释掉的是我原来写的有错的地方。
正确代码:
#include <iostream> class String { public: String(const char *str=NULL);//普通构造函数 String(const String &str);//拷贝构造函数 String & operator =(const String &str);//赋值函数 ~String();//析构函数 protected: private: char* m_data;//用于保存字符串 }; //普通构造函数 String::String(const char *str){ if (str==NULL){ m_data=new char[1]; //对空字符串自动申请存放结束标志'\0'的空间 //此处写成new char[1]还有一个原因,就是释放的时候可以调用delet[] if (m_data==NULL){//内存是否申请成功 std::cout<<"申请内存失败!"<<std::endl; exit(1); } m_data[0]='\0'; } else{ int length=strlen(str); m_data=new char[length+1]; if (m_data==NULL){//内存是否申请成功 std::cout<<"申请内存失败!"<<std::endl; exit(1); } strcpy(m_data,str); } } //拷贝构造函数 String::String(const String &str){ //输入参数为const型 int length=strlen(str.m_data); m_data=new char[length+1]; if (m_data==NULL){//内存是否申请成功 std::cout<<"申请内存失败!"<<std::endl; exit(1); } strcpy(m_data,str.m_data); } //赋值函数 String& String::operator =(const String &str){//输入参数为const型 if (this==&str) //检查自赋值。。。。证同测试。。如果是自我赋值,就不做任何事。 return *this; int length=strlen(str.m_data); delete [] m_data;//释放原来的内存资源 m_data= new char[length+1]; if (m_data==NULL){//内存是否申请成功 std::cout<<"申请内存失败!"<<std::endl; exit(1); } strcpy(m_data,str.m_data); return *this;//返回本对象的引用 } //析构函数 String::~String(){ delete [] m_data; } void main(){ String a; String b("abc"); system("pause"); }

浙公网安备 33010602011771号