自定义了一个MyString类:涉及到了一个类最基本的构造函数、析构函数、深拷贝,内存管理等问题。
头文件:
#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <string.h>
using namespace std;
class MyString
{
public:
friend ostream &operator<<(ostream &out, const MyString &obj);
MyString(const char* str=NULL); //ctor
MyString(const MyString &obj); //copy ctor
~MyString(); //dtor
MyString& operator=(const MyString &obj);
MyString substr(int start, int len); //返回char* 不好进行内存管理,采用类类型,借鉴string
void setData(const char* str);
void display();
private:
char *m_data;
int m_len;
};
#endif // MYSTRING_H
CPP文件:
#include "MyString.h"
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
ostream &operator<<(ostream &out, const MyString &obj)
{
cout << obj.m_data;
return out;
}
MyString::MyString(const char* str)//默认参数只在声明的时候写上
{
cout << "调用构造函数:";
if (str == NULL)
{
m_data = NULL;
return;
}
m_len = strlen(str) ;
m_data = new char[m_len+1];
strcpy(m_data, str);
cout << m_data<<endl;
}
MyString::MyString(const MyString &obj) //拷贝构造函数,使用深拷贝
{
cout << "调用拷贝构造:";
if (obj.m_data == NULL)
{
m_data = NULL;
return;
}
m_len = strlen(obj.m_data); //这里不能用sizeof,因为指针是无法求其指向内容的大小的,字符数组才可以。
m_data = new char[m_len+1];
strcpy(m_data, obj.m_data);
cout << m_data << endl;
}
MyString & MyString::operator=(const MyString &obj)
{
if (this != &obj)//检查自赋值
{
cout << "释放原有内存..."<< endl;
MyString temp(obj); //离开作用于释放内存,释放的是原对象指向的内存
char *ptemp = m_data;
this->m_data = temp.m_data;
temp.m_data = ptemp;
}
return *this;
}
MyString::~MyString()
{
cout << "调用析构: "<< m_data << endl;
if (m_data != NULL)
{
delete[]m_data;
m_data = NULL;
}
}
void MyString::display()
{
cout << m_data << endl;
}
MyString MyString::substr(int start, int len)
{
if (start < 0 || len < 0)
return "";
char* buf = new char[len + 1];
int i = start;
int j = start + len ;
for (int k = i; k < j; k++)
{
buf[k - i] = m_data[k];
}
buf[len] = '\0';
return MyString(buf);
}
void MyString::setData(const char* str)
{
if (m_data != NULL)
{
cout << "释放原有内存" << endl;
delete m_data;
m_data = NULL;
}
if (str == NULL)
return;
m_len = strlen(str);
m_data = new char[m_len + 1];
strcpy(m_data, str);
cout << m_data << endl;
}
测试程序:
char p[1000] = { 0 };
while (1)
{
memset(p, 0, sizeof(p));
cout << "请输入:(按q/Q退出)" << endl;
cin.getline(p, 1000);
if (!strcmp(p, "q") || !strcmp(p, "Q"))
break;
MyString s(p);//离开作用域自行调用析构函数
cout << s.substr(0, 3) << endl;//这句话执行就调用析构
cout << "***********" << endl;
//s.display();
MyString s1(s);
//ss.display();
cout<<"*******"<<endl;
MyString s2 = s;
cout<<"*******"<<endl;
s2.setData("Hello world!");
s1 = s2;
}