1. 类的声明,构造函数,拷贝构造函数,赋值函数
代码实现
class String
{
public:
String(const char* initChar);
String(const String& str);
String& operator = (const String& str);
private:
char* m_data;
}
String::String(const char* initChar)
{
if(initChar == NULL)
{
m_data = new char[1];
m_data[0] = '\0';
}
else
{
int length = strlen(initChar);
m_data = new char[length + 1];
strcpy(m_data, initChar);
}
}
String::String(const String& str)//拷贝构造函数首先是一个构造函数,所以申明中没有返回值
{
//此处不需要对str判空,因为str 是引用,引用本身比可能是NULL.
int length = strlen(str.m_data);//str 本身不能直接访问私有变量
m_data = new char[length + 1];
strcpy(m_data, str);
}
String& operator=(const String& str)
{
if(this == &str)//注意这个地方比较的是地址。
return *this;//我们需要的是变量(对象实体)
if(m_data != NULL)
delete[] m_data;
int length = strlen(str.m_data);
m_data = new char[length + 1];
strcpy(m_data, str);
return *this;
}
原则上,如果一个类中含有指针变量,则必须手动实现拷贝构造函数和赋值函数。防止因为浅拷贝造成的错误。
如果确实不需要,防止将来出错的方式是将拷贝构造函数和赋值函数声明为 私有函数。
class String
{
public:
String(const char* str);
private:
String(const String & str);
String& operator =(const String& str);
}
在子类的赋值函数中需要给父类重新赋值:
class base
{
public:
base();
base(const base& b);
base& operator =(const base& b);
private:
int m_i;
}
class derived:public base
{
public:
derived();
derived& operator = (const derived& der);
private:
int m_x;
}
derived& operator =(const derived& der)
{
if(this == &der)
return *this;
base::operator=(der);
m_x = der.m_x;
}