您的位置:首页 > 其它

string类的构造函数,拷贝构造函数,析构函数和赋值函数

2010-07-27 16:31 295 查看
String 类的原型如下
class String
{
public:
String(const char *str=NULL); //构造函数
String(const String &other); //拷贝构造函数
~String(void); //析构函数
String& operator=(const String &other); //等号操作符重载,赋值函数
ShowString();
private:
char *m_data; //字符指针
};
String::~String()
{
delete [] m_data; //析构函数,释放地址空间
}
String::String(const char *str)
{
if (str==NULL)//当初始化串不存在的时候,为m_data申请一个空间存放'/0';
{
m_data=new char[1];
*m_data='/0';
}
else//当初始化串存在的时候,为m_data申请同样大小的空间存放该串;
{
int length=strlen(str);
m_data=new char[length+1];
strcpy(m_data,str);
}
}
String::String(const String &other)//拷贝构造函数,功能与构造函数类似。
{
int length=strlen(other.m_data);
m_data=new [length+1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &other) //赋值函数
{
if (this==&other)//当地址相同时,直接返回;
return *this;

delete [] m_data;//当地址不相同时,删除原来申请的空间,重新开始构造;
int length=sizeof(other.m_data);
m_data=new [length+1];
strcpy(m_data,other.m_data);
return *this;
}

String::ShowString()//由于m_data是私有成员,对象只能通过public成员函数来访问;
{
cout<<this->m_data<<endl;
}

测试一下:
main()
{
String AD;
char * p="ABCDE";
String B(p);
AD.ShowString();
AD=B;
AD.ShowString();
}
=========================================================================
再来淡淡关于拷贝构造函数和赋值函数的使用比较
上例是比较拷贝构造函数和赋值函数很好的示例。
拷贝构造函数,首先是一个构造函数,因此函数实现的是拷贝它唯一const参数引用变量(也是对象)的内部数据作为初始化。所以对象创建时使用构造拷贝函数(这时需要初始化对象)。
而赋值函数则不同。赋值函数属于类的成员函数,并且是一个运算符重载函数。该函数应用在对象已经创建后,需要对对象赋值时使用。由于是重载函数,返回的是一个对象,而拷贝构造函数不用返回任何值。
String a("zhangbufeng");
String b("cuixiaoyuan");
String c(a);//对象创建时,使用拷贝构造函数
c=b; //c已经被初始化,从而调用了赋值函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐