待续
#include <QCoreApplication>
#include <QTextStream>
#include<iostream>
using namespace std;
class String
{
public:
String(const char *str=NULL); //普通构造函数
String(const String &other); //复制构造函数
~String(void); //析构函数
String & operator=(const String &other);//赋值函数
private:
char *m_String; //私有成员,保存字符串
};
/*
*普通构造函数
*构造函数首先根据一个字符串常量创建一个String对象。
*这个构造函数首先分配了足够的内存,然后把这个字符串常量复制到这块内存
*/
String::String(const char *str)
{
cout<<"普通构造函数"<<endl;
if(str==NULL) //如果str为空,存空字符串
{
m_String=new char[1]; //分配一个字节
if (m_String==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
*m_String='\0'; //将之赋值为字符串结束符
}
else
{
m_String=new char[strlen(str)+1]; //分配空间容纳str内容
if (m_String==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
strcpy(m_String,str); //赋值str到私有成员
}
}
/*
*拷贝构造函数
*所有需要分配系统资源的用户定义类型都需要一个拷贝构造函数
*它可以在函数调用中以传值得方式传递一个String类型的参数
*并且在当一个函数以值得形式返回String对象时实现“返回时复制”
*/
String::String(const String &other)
{
cout<<"复制构造函数"<<endl;
m_String=new char[strlen(other.m_String)+1];
if (m_String==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
strcpy(m_String,other.m_String);
}
/*
*定义析构函数是为了方式内存泄露,当一个String对象超出
*它的作用域时,析构函数就会释放它所占用的内存
*/
String::~String(void)
{
cout<<"析构函数"<<endl;
if(m_String!=NULL) //如果m_String 不为NULL,释放堆内存
{
delete [] m_String; //释放后置为NULL
m_String=NULL;
}
}
/*
*赋值函数实现字符串的传值活动
*/
String & String::operator =(const String &other)
{
cout<<"赋值函数"<<endl;
if(this==&other) //如果对象与other是同一个对象
{
return *this; //直接返回本身
}
delete [] m_String;
m_String=new char[strlen(other.m_String)+1];
if (m_String==NULL)
{//内存是否申请成功
std::cout<<"申请内存失败!"<<std::endl;
exit(1);
}
strcpy(m_String,other.m_String);
return *this;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
printf("mystring");
getchar();
String strA("hello"); //调用普通构造函数
String strB("word"); //调用普通构造函数
String strC(strA); //调用复制构造函数
strC=strB; //调用赋值函数
QTextStream qin(stdin);
QTextStream qout(stdout);
QString qstr;
qin>>qstr;
qout<<qstr<<endl;
return a.exec();
}