1:MyString.h
#pragma once
class myCString
{
public:
int GetLength()const {return m_nLength;}
myCString(void);//无参构造函数
myCString(const char* p);//根据字符串常量初始化
myCString(const myCString& rhs);//拷贝构造
myCString(char ch,int nRepeat = 1);//串内有n个ch字符
myCString(const char* cstr, int nLength);//根据字符串常量的一部分进行构造
operator const char* (){return m_pDate;}//类型转换函数
public:
char operator[](int nIndex) const;//获取串内上的某个字符
myCString& operator = (const char* cstr);
myCString& operator = (const myCString& str);
myCString& operator +=(const char* p);
myCString& operator +=(const myCString& str);
public:
myCString operator+( const char* pszSrc) const; //来源不改变,返回一个对象
myCString operator+( const myCString& str) const; //来源不改变,返回一个对象
friend bool operator!=(const myCString& str1,const myCString& str2);
friend bool operator==(const myCString& str1,const myCString& str2);
friend bool operator< (const myCString& str1, const myCString& str2);
friend bool operator> (const myCString& str1, const myCString& str2);
~myCString(void);
private:
int m_nLength;
char* m_pDate;
};
MyString.cpp
#include "stdafx.h"
#include "myCString.h"
#include <string.h>
#include <iostream>
using namespace std;
myCString::myCString(void)
{
m_pDate = new char(0);
m_nLength = 0;
}
myCString::myCString(const char* p)
{
if (p == NULL)
{
m_pDate = new char[1];
*m_pDate = '\0';
}
m_nLength = strlen(p);
m_pDate = new char[m_nLength+1];
strcpy(m_pDate,p);
}
myCString::myCString(const myCString& rhs)
{
m_nLength = rhs.m_nLength;
m_pDate = new char[m_nLength+1];
strcpy(m_pDate,rhs.m_pDate);
}
myCString::myCString(char ch,int nRepeat)//串内有n个ch字符
{
m_nLength = nRepeat;
m_pDate = new char[m_nLength + 1];
for (int i = 0; i < m_nLength; i++)
{
m_pDate[i] = ch;
}
m_pDate[m_nLength] = '\0';
}
myCString::myCString(const char* cstr, int nLength)//根据字符串常量的一部分进行构造
{
m_nLength = strlen(cstr);
m_nLength = m_nLength<nLength? m_nLength:nLength;//在cstr字符串的长度和 输入的nLength中选择比较小的
m_pDate = new char[m_nLength+1];
for(int i = 0; i < m_nLength; i++)
{
m_pDate[i] = cstr[i];
}
m_pDate[m_nLength] = '\n';
}
char myCString::operator[](int nIndex) const
{
return m_pDate[nIndex];
}
myCString& myCString::operator = (const char* cstr)
{
char* mOldp = m_pDate;//保存旧的指针 effective C++ 条款11
m_nLength = strlen(cstr);
m_pDate = new char[m_nLength+1];//分配多一个字节存放\0;
strcpy(m_pDate,cstr);
delete mOldp;
return *this;
}
myCString& myCString::operator = (const myCString& str)
{
//不加if里面的也可以,但是加上效率高一点,因为如果str的长度小于原来的长度,那么就不用重新申请空间了。
if (m_nLength > str.m_nLength)
{
strcpy(m_pDate,str.m_pDate);
}
else
{
char* mOldp = m_pDate;
m_nLength = str.GetLength();
m_pDate = new char[m_nLength+1];
strcpy(m_pDate,str.m_pDate);
delete mOldp;
return* this;
}
}
/* //可能出现内存泄漏
myCString& myCString::operator +=(const char* p)
{
m_nLength = m_nLength+strlen(p);
char* pNew = new char[m_nLength+1];
strcpy(pNew,m_pDate);
strcat(pNew,p);
delete []m_pDate;
m_pDate = pNew;
return *this;
}
*/
myCString& myCString::operator +=(const char* p)
{
char* pOld = m_pDate;
m_nLength = m_nLength+strlen(p);
char* pNew = new char[m_nLength+1];
strcpy(pNew,m_pDate);
strcat(pNew,p);
m_pDate = pNew;
delete pOld;
return *this;
}
myCString& myCString::operator +=(const myCString& str)
{
char* pOld = m_pDate;
m_nLength = m_nLength + str.m_nLength;//str.GetLength();//这里刚开始以为str不能直接访问a,
//结果也可以,大吃一惊啊,原来只要是成员函数当中的类对象就可以访问私有成员。
char* pNew = new char[m_nLength+1];
strcpy(pNew,m_pDate);
strcat(pNew,str.m_pDate);
m_pDate = pNew;
delete pOld;
return *this;
}
//怀疑pszSrc是其他的myCString对象,不是this的对象不能调用其私有成员??
//应该是可以调用的,因为只要调用位置是myCString类的成员函数就够了。
myCString myCString::operator+( const char* pszSrc)const //来源不改变,返回一个对象
{
myCString rec;
rec.m_nLength = m_nLength +strlen(pszSrc);
rec.m_pDate = new char[m_nLength+1];
strcpy(rec.m_pDate,m_pDate);
strcat(rec.m_pDate,pszSrc);
return rec;
}
//只读函数:让this指针变为了const myString*类型
//非只读函数:this指针 原本是myString* 类型
//friend CString operator +( const CString& string1, const CString& string2 );
//只读函数后面的const与全局函数中左值前面的const达到的效果相同
myCString myCString::operator+( const myCString& str) const //来源不改变,返回一个对象
{
myCString rec;
delete []rec.m_pDate;
rec.m_nLength = m_nLength+str.m_nLength;
rec.m_pDate = new char[m_nLength+1];
strcpy(rec.m_pDate,m_pDate);
strcat(rec.m_pDate,str.m_pDate);
return rec;
}
bool operator!=(const myCString& str1,const myCString& str2)
{
bool b = strcmp(str1.m_pDate,str2.m_pDate);
return b != 0;
}
bool operator==(const myCString& str1,const myCString& str2)
{
bool b = strcmp(str1.m_pDate,str2.m_pDate);
return !b;
}
bool operator<(const myCString& str1, const myCString& str2)
{
return strcmp(str1.m_pDate,str2.m_pDate)<0;
}
bool operator > (const myCString& str1, const myCString& str2)
{
return strcmp(str1.m_pDate,str2.m_pDate)>0;
}
myCString::~myCString(void)
{
delete []m_pDate;
}
3:main.cpp
// String编写.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "myCString.h"
#include <iostream>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/*
myCString str1;
myCString str2("Hello");
myCString str3("你是谁");
str2 += "World";
myCString str4 = str2;
cout<<(const char*)str2<<endl;
cout<<str2.GetLength()<<endl;
char a[7]="abcdef";
char b[4]="ABC";
strcpy(a,b);
for(int i=0;i<7;i++)
printf ("%c",a[i]); //说明strcpy不是清除后再赋值
*/
myCString str1("Hello");
myCString str2(str1);
if (str2 == str1)
{
cout<<"相等"<<endl;
}
myCString str3("HH");
if (str3 != str2)
{
cout<<"不相等"<<endl;
}
getchar();
return 0;
}