C++语言基础(实现string类)

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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值