侯捷 C++ string知识点总结

此文章主要内容为侯捷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;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值