简单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");
}

 

posted @ 2016-11-10 15:55  ren_zhg1992  阅读(132)  评论(0)    收藏  举报