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

来源:互联网 发布:大数据可视化软件 编辑:程序博客网 时间:2024/04/30 06:37

 

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已经被初始化,从而调用了赋值函数。

 

原创粉丝点击