此文章主要内容为侯捷C++面向对象中string课程的总结
class 类中含有指针,那么这个类一定要由拷贝构造函数和拷贝赋值函数,如果用原编译器的赋值函数,只对指针所指向的地址进行赋值或者拷贝,而非指针地址所指向的内容。
class String
{
public:
String (const char* cstr = 0);
String (const char* String& str); //拷贝构造函数
String& operateor = (const String& str); //拷贝赋值函数
~String(); //Big Three
Char* get_c_str() const {return m_data_;} //因没有改变成员数据,所以加const
private:
char* m_data_;
}
构造函数和析沟函数的定义
String::String(const char* cstr = 0){
if(cstr){
m_data_ = new char [strlen(cstr)+1]; //创建相应长度的字符串内存
strcpy(m_data_, cstr); //将cstr拷贝到m_data_中
}else{ //未指定初值
m_data_ = new char[1];
*m_data_ = '\0';
}
}
String::~String(){
delate[] m_data_;
}
class with pointer members 必须有拷贝构造和拷贝赋值的原因:
用默认的拷贝构造使得b的data 指向与a相同,但是b原先所指向的数据会造成内存泄漏。
且由于是浅拷贝,一旦a的data指向的数据所改变,b的data也会同样的改变。
拷贝构造函数
inline String::String(const String& str){
m_data_ = new char[strlen(str.m_data_) + 1];
strcpy(m_data_, str.m_data_);
}
//实现
String s1('Hello');
String s2(s1);
// String s2 = s1;
拷贝赋值函数:
String& String::operator = (const String& str){
if (this == &str){
return *this; } //检测自我赋值 目的:效率 和 正确性
delate[] m_data_; //删除原有的数据
m_data_ = new char[strlen(str.m_data_) + 1]; //创建适当长度的内存空间
strcpy(m_data_, str.m_data_); //赋值
return *this;
}