#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;
}
重载=号的时候,copy这一步使用深拷贝非常重要
最新推荐文章于 2021-02-03 04:28:17 发布