重载=号的时候,copy这一步使用深拷贝非常重要

#include <iostream>
#include <cstring>
using namespace std;

class SString
{
private:
    char* s_;
    size_t len_;//size_t等价于unsigned int也就是>=0的意思;s_=newchar(2*len_);
    size_t siz_;//2*len_;空洞,对内存的使用更有利;分配内存空间;siz=2*len_;
public:
    SString():len_(0),siz_(0),s_(NULL) {}
    SString(const char* s);
    SString(const SString& s);
    void show();
    ~SString()
    {
        delete []s_;
        cout<<"destruction**********************"<<endl;
    }
    SString& operator=(const SString& s);
    friend ostream& operator<<(ostream& os,SString& s)
    {
        os<<s.s_<<endl;
        return os;
    }
    SString& copy(const SString& s);//拷贝的时候要考虑互拷,长度比较大小,能不能容得下;
};
SString::SString(const char* s):len_(0),s_(NULL)
{
    while(s[len_]!=0)len_++;
    siz_=2*len_;
    s_=new char[siz_];
    for(int i=0; i<len_; i++)s_[i]=s[i];
    s_[len_]=0;//等同于'\0';
}
SString::SString(const SString& s):s_(NULL),len_(s.len_),siz_(s.siz_)
{
    s_=new char[siz_];
    for(int i=0; i<len_; i++)s_[i]=s.s_[i];
    s_[len_]=0;
}
void SString::show()
{
    for(int i=0; i<len_; i++)
        cout<<s_[i];
    cout<<endl;
}
SString& SString:: operator=(const SString& s)//默认的等号只是把指针的地址给它了;
{
    cout<<"operator=::::::::";
    copy(s);
    return *this;
}
//ostream& operator<<(ostream& os,SString& s)

SString& SString:: copy(const SString& s)//非常重要;
{
    if(len_<s.len_)
    {
        delete []s_;
        s_=new char[s.len_*2];
        len_=s.len_;
        siz_=s.siz_;
    }
    for(int i=0; i<len_; i++)s_[i]=s.s_[i];
    s_[len_]=0;
    return *this;
}
int main()
{
    char a[10]="efghij";
    SString str1,str4;
    SString str2("xyabcd");
    SString str3(str2);//如果没有赋值的话,要考虑一下这块内存够不够;
    str4=str1=str2;//在类内部仅有这种简单的赋值的话,也就是浅拷贝,从来没有new过运算符的时候需要重载运算符,从而给它分配一个新的空间;
//    str2.show();
//    str3.show();
//    str1.show();
//    str4.show();
    cout<<str1<<endl;
    cout<<str2<<endl;
    cout<<str3<<endl;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值