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

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

,每个人都有自己鲜明的主张和个性,

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

相关文章:

你感兴趣的文章:

标签云: