string类的实现
涉及到
拷贝构造函数调用的三种情况
深拷贝浅拷贝
const修饰为常函数
重载输出<<
重载赋值运算符=
重载下标运算符[]
/*
拷贝构造函数调用的三种情况?
1.用一个对象初始另一个对象
2.用对象作为实参传递给函数
3.函数的返回值为对象,创建临时对象作为返回值
深拷贝
在计算机中开辟了一块新的内存地址用于存放复制的对象。
浅拷贝
只是完成数据本身的赋值 ,浅复制仅仅是指向被复制的内存地址,
如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变
char s[10]="qwe123";
char *s1,*s2;
s1=s;//浅拷贝
s2=new char[strlen(s)+1];// 深拷贝
strcpy(s2,s);
*/
#include<iostream>
#include<string>
using namespace std;
class m_string{
private:
char* str;
int len;
public:
//默认构造函数
m_string();
//析构函数
~m_string();
//带参数构造函数
m_string(const char* s);
//拷贝构造函数
m_string(const m_string& tmp);
//输出函数
void show()const;//const修饰为常函数,不允许改变数据成员
//重载输出
friend ostream& operator << (ostream& os,const m_string& m);
//重载赋值运算符
m_string& operator=(m_string& m);
//重载下标运算符
char& operator [](int n);
//验证第三种拷贝构造函数调用:3.函数返回值为类对象,创建临时对象作为返回值
m_string get_info();
};
//2.对象作为实参传递给函数参数
void test_cp(m_string m){
m.show();
}
int main(){
{
m_string s2("qwe");
1.使用一个对象初始化另一个对象
//m_string s3(s2);
//test_cp(s2);
//s3.get_info();
m_string t;
t=s2;
cout<<t;
cout<<t[0]<<endl;
cout<<t[5]<<endl;
}
system("pause");
return 0;
}
m_string::m_string(){
str=NULL;
len=0;
cout<<"默认函数调用"<<endl;
}
m_string::~m_string(){
if(str != NULL)
delete str;
cout<<"析构函数调用"<<endl;
}
m_string::m_string(const char* s){
len=strlen(s);
str=new char[len+1];
strcpy(str,s);
str[len]='\0';
cout<<"带形参构造函数调用"<<endl;
}
m_string::m_string(const m_string& tmp){
len=tmp.len;
str=new char[len+1]; //使用深拷贝
strcpy(str,tmp.str);
str[len]='\0';
cout<<"拷贝函数调用"<<endl;
}
void m_string::show()const{
if(str)
cout<<str<<endl;
else
cout<<"NULL"<<endl;
}
//重载输出
ostream& operator << (ostream& os,const m_string& m){
if(m.str)
os<<m.str<<endl;
else
os<<"NULL"<<endl;
return os;
}
//验证第三种拷贝构造函数调用
m_string m_string::get_info(){
m_string t(str);
return t;
}
//重载赋值运算符
m_string& m_string::operator=(m_string& m){
if(str)
delete str;
this->len=m.len;
this->str=new char[len+1];
strcpy(this->str,m.str);
return *this;
}
//重载下标运算符
char& m_string::operator [](int n){
static char ch='\0';
if(n<0||n>=len){
cout<<"下标越界"<<endl;
return ch;
}
else
return str[n];
}