string类的实现

来源:互联网 发布:软件的摊销年限 编辑:程序博客网 时间:2024/06/06 08:43

面试题目,好久没写代码,写下了下面的代码:

#pragma once
class AString
{
public:
AString(const char* pInput = NULL);
~AString(void);
AString(const AString &OtherString);//拷贝构造函数,开始没有想起
AString operator+(const AString &OtherString);
AString operator=(const AString &OtherString);
bool operator==(AString &OtherString);
int AstrLen(AString &InputString);




private:
char* m_pData;
};

#include "StdAfx.h"
#include "AString.h"

AString::AString(const char* pInput)
{
if(!pInput)
{
int nSize = 0;
char* p = (char*)pInput;
while(p++)
nSize++;
m_pData = new char[nSize+1];
strcpy(m_pData,pInput);
}
else
{
m_pData = NULL;
}
}




AString::~AString(void)
{
if(NULL != m_pData)
{
delete[] m_pData;
m_pData = NULL;
}




}
AString::AString(const AString &OtherString)
{
if(NULL != OtherString)
{
stcpy(m_pData,OtherString->m_pData);
}

}
AString AString::operator+(const AString &OtherString)
{
if(OtherString->m_pData != NULL)
{
int nSize = strlen(OtherString->m_pData)+strlen(m_pData);
char tmpChar = new char[nSize];
stcpy(tmpChar,m_pData);
stcat(tmpChar,OtherString->m_pData);
AString tmpStr = new AString(const char*(tmpChar));
return tmpSrt;
}
else
{
return *this;
}
}
AString AString::operator=(const AString &OtherString)
{
if(OtherString->m_pData != NULL)
{
delete []m_pData;
int nSize = strlen(OtherString->m_pData);
char *tmpChar = new char[nSize];
stcpy(tmpChar,m_pData);
m_pData = tmpChar;

return *this;
}
else
{
return *this;
}
}

int AString::AstrLen(AString &InputString)
{
int nTmp = 0;
if(NULL == InputString)
{
return 0;
}
char*p = InputString->m_pData;
while('\0' != *p++)
{
nTmp++;
}
return nTmp;

               //下面即可

       return strlen(m_data);
}


下面是修改加注释

#pragma once

//应该加上下面三行

#include<iostream>

#include<iomanip> 

using namespace std;  


class AString
{
public:
AString(const char* pInput = NULL);          //赋值构造兼默认构造函数(char)  
~AString(void);
AString(const AString &OtherString); //赋值构造函数(String)  
AString operator+(const AString &OtherString);
AString& operator=(const AString &OtherString);//返回值应该是AString&,而不是AString
bool operator==(AString &OtherString);//应改为bool operator==(const AString &OtherString);
int AstrLen(AString &InputString);//改为size_t size(){return strle(m_pData):}




private:
char* m_pData;
};

#include "StdAfx.h"
#include "AString.h"

AString::AString(const char* pInput)  //应该改为inline AString::AString(const char* pInput)  
{

//声明为inline函数,则该函数在程序中被执行时是语句直接替换,而不是被调用  
if(pInput)
{
int nSize = 0;     
char* p = (char*)pInput;
while(p++)
nSize++;
m_pData = new char[nSize+1];//可以直接改为m_pData = new char[strlen(pInput)+1];
strcpy(m_pData,pInput);
}
else
{
m_pData = NULL;
}
}




AString::~AString(void)
{
if(NULL != m_pData)
{
delete []m_pData;
m_pData = NULL;
}




}
AString::AString(const AString &OtherString)//应该改为inline AString::AString(const AString &OtherString)
{
if(NULL != OtherString)
{

                       if(NULL != m_pData)

{

    delete m_pData;

                                m_pData = NULL;

}

                      m_pData =new char[strlen(OtherString.m_pData)+1];  
stcpy(m_pData,OtherString->m_pData);
}

}
AString AString::operator+(const AString &OtherString)//前面应该加inline
{
if(OtherString->m_pData != NULL)
{
int nSize = strlen(OtherString->m_pData)+strlen(m_pData);
char tmpChar = new char[nSize];
stcpy(tmpChar,m_pData);
stcat(tmpChar,OtherString->m_pData);
AString tmpStr = new AString(const char*(tmpChar));
return tmpSrt;
}
else
{
return *this;
}

               //应改为下面

              

  1.     String newString;  
  2.     if(!other.m_data)  
  3.         newString = *this;  
  4.     else if(!m_data)  
  5.         newString = other;  
  6.     else  
  7.     {  
  8.         newString.m_data = new char[strlen(m_data)+strlen(other.m_data)+1];  
  9.         strcpy(newString.m_data,m_data);  
  10.         strcat(newString.m_data,other.m_data);  
  11.     }  
  12.     return newString; 

}
AString AString::operator=(const AString &OtherString) //前面应该加inline
{
if(OtherString->m_pData != NULL)
{
delete []m_pData;
int nSize = strlen(OtherString->m_pData);
char *tmpChar = new char[nSize];
stcpy(tmpChar,m_pData);
m_pData = tmpChar;

return *this;
}
else
{
return *this;
}

                //应该改为下面

               

  1.  if (this!=&other)  
  2.     {  
  3.         delete[] m_data;  
  4.         if(!other.m_data) m_data=0;  
  5.         else  
  6.         {  
  7.             m_data = new char[strlen(other.m_data)+1];  
  8.             strcpy(m_data,other.m_data);  
  9.         }  
  10.     }  
  11.     return *this;  

}

int AString::AstrLen(AString &InputString)
{
int nTmp = 0;
if(NULL == InputString)
{
return 0;
}
char*p = InputString->m_pData;
while('\0' != *p++)
{
nTmp++;
}
return nTmp;
}





0 0