下面给一个String类:
class String
{
public:
String(const char*cstr=0);//构造函数(有默认值)
String(const String& str);//拷贝构造函数
String operator=(const String& str);//拷贝赋值函数
~String()//析构函数
private:
char* m_data;
};
构造函数
构造函数无返回值类型,且在创建对象时被自动调用。
inline String::String(const char* cstr=0)
{
if(cstr)
{
m_data=new char[strlen()+1];//因为要存放一个'\0'作为字符串结束的标志,所以+1
strcpy(m_data,cstr)
}
else
{
m_data=new char[1];
*m_data='\0';
}
}
当我要使用构造函数的时候,应该如下:
{
String s1();
String s2("hello");
}
析构函数
当对象离开作用域或被显式地删除时,析构函数被自动调用
防止内存泄漏
inline String::~String()
{
delete[] m_data
}
拷贝构造函数
下面的拷贝构造函数为深拷贝,使用浅拷贝会发生内存泄漏
inline
String::String(const String& str)
{
m_data=new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data)
}
String s2(s1)//使用
拷贝赋值函数
这里相较于拷贝构造函数的区别是,已经创建好了两个object,我们要先把一个清空,在进行拷贝构造函数的步骤
String& String::operator(const String &str)
{
if(this==&str)//检测自我赋值
return *this;
delete[]m_data;
m_data=new char[strlen(str.m-data)+1];
strcpy(m_data,str.m_data);
return *this;
}
这里检测自我赋值是很有必要的,因为如果this=&str的话,那二者所指向的地址是一样的,一旦进行delete,那么唯一的值就消失了