myString.h
#ifndef MYSTRING_H
#define MYSTRING_H
class myString
{
public:
myString(const char * s=nullptr);
myString(const myString & another);//deep 拷贝
myString& operator=(const myString & another);//赋值 拷贝
void dis();
~myString();
private:
char *str_;
};
#endif // MYSTRING_H
#include "myString.h"
#include <iostream>
#include <string.h>
int k=1;//构造次数
int kk=1;//析构次数
int cpys=1;//deep 拷贝次数
myString::myString(const char * s)
{
if(s==nullptr)
{
str_=new char[1];//空串
*str_='\0';
std::cout<<"空串"<<std::endl;
}else
{
int len=strlen(s)+1;//非空串
str_=new char[len];//开辟内存空间
memset(str_,0,len);//初始化
strcpy(str_,s);//
std::cout<<"非空串"<<std::endl;
}
std::cout<<"myString() 构建"<<k<<"次"<<std::endl;
k++;
}
myString::myString(const myString & another)//deep 拷贝
{
int len=strlen(another.str_)+1;
str_=new char[len];//申请空间
memset(str_,0,len);//初始化空间
strcpy(str_,another.str_);
std::cout<<"myString(const myString & another) deep拷贝"<<cpys<<"次"<<std::endl;
cpys++;
}
myString& myString::operator=(const myString & another)//赋值 拷贝
{
if(this==&another)
return *this;
delete []this->str_;//自己存了 其它对象的地址 为了避免内存泄露
//把自己的内存释放掉
int len=strlen(another.str_)+1;
str_=new char[len];//申请空间
memset(str_,0,len);//初始化空间
strcpy(str_,another.str_);
return *this;//对象 d1=d2=d3
}
void myString::dis()
{
std::cout<<str_<<std::endl;
}
myString::~myString()
{
std::cout<<"~myString() 析构"<<kk<<"次"<<std::endl;
kk++;
delete []str_;
}
#include "myString.h"
using namespace std;
// k;//构造次数
// kk;//析构次数
//cpys;//deep 拷贝次数
int main()
{
// myString sc;//myString() k=1 ~myString() kk=1
// sc.dis();
myString sc1("canadajksadsdsjfsssssssssssssssssssssssssssssssss");
// myString sc2(sc1);//用已有对象初始化新对象
// sc1.dis();
myString sc3;
sc3=sc1;
sc3.dis();
// cout << "Hello World!" << endl;
return 0;
}