【C++练习】编写MyString类

编写MyString类,用于表示字符串。要求:

1、MyString类有一个成员变量,用于存放字符串的内容:
char* val

2、MyString类具有如下几个构造函数:
MyString(); //产生空串
MyString(int iVal); //将iVal转成字符串,并初始化成员变量val
MyString(float fVal);//将fVal转成字符串,并初始化成员变量val
MyString(char* s); //用s来初始化成员变量val
MyString(MyString& obj);//拷贝构造函数

3、重载如下运算符:
//字符串连接运算
MyString operator+(char* s);
MyString operator+(char c);
MyString operator+(MyString obj);

MyString operator=(char* );
MyString operator=(MyString obj);
char operator[](int index);

4、析构函数
~MyString();

其他成员函数可自行扩充。并编写测试主程序,逐个测试这些构造函数和运算符重载。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
using namespace std;

class MyString
{
protected:
	char* val;

public:
	MyString();  //产生空串
	MyString(int iVal);  //将iVal转成字符串,并初始化成员变量val
	MyString(float fVal);//将fVal转成字符串,并初始化成员变量val
	MyString(char* s);   //用s来初始化成员变量val
	MyString(MyString& obj);//拷贝构造函数
	
    //字符串连接运算
	MyString operator+(char* s);
	MyString operator+(char c);
	MyString operator+(MyString obj);

	MyString& operator=(char* s);
	MyString& operator=(MyString obj);
	char operator[](int index);
	~MyString();

	void show();
	void alter(int iVal);
};

void MyString::alter(int iVal)  //修改
{
	snprintf(val, 19, "%d", iVal);
}

MyString::MyString()  //产生空串
{
	val = new char[1];
	val[0] = '\0';
}
MyString::MyString(int iVal)  //将iVal转成字符串,并初始化成员变量val
{
	val = new char[20];
	snprintf(val, 19, "%d", iVal);
}
MyString::MyString(float fVal)//将fVal转成字符串,并初始化成员变量val
{
	val = new char[20];
	snprintf(val, 19, "%f", fVal);
}
MyString::MyString(char* s)  //用s来初始化成员变量val
{
	val = new char[20];
	val = s;
}
MyString::MyString(MyString& obj)//拷贝构造函数
{
	val = new char[20];
	memcpy(val,obj.val,19* sizeof(char));
}

MyString MyString::operator+(char* s)//重载+号
{
	char a[20];
	strcpy_s(a, val);
	sprintf_s(val,20,"%s%s", a, s);
	return *this;
}
MyString MyString::operator+(char c)
{
	char a[20];
	strcpy_s(a, val);
	sprintf_s(val, 20, "%s%c", a, c);
	return *this;
}
MyString MyString::operator+(MyString obj)
{
	snprintf(val, 20, "%s%s",val,obj.val);
	return *this;
}

MyString& MyString::operator=(char* s)//重载=号
{
	snprintf(val, 4, "%s",s);
	return *this;
}
MyString& MyString::operator=(MyString obj)
{
	snprintf(val, 20, "%s",obj.val);
	return *this;
}

char MyString::operator[](int index)//重载[]号
{
	return val[index];
}

MyString::~MyString()//析构函数
{
	delete val;
}


void MyString::show()
{
	printf("%s\n", val);
}

int main()
{
	char s[4]="str";
	MyString a(123);
	cout << "用整型初始化:";
	a.show();

	MyString b(((float)12.3));
	cout << "用浮点数初始化:";
	b.show();

	MyString c(s);
	cout << "用char* s初始化:";
	c.show();
	
	MyString d=c;
	cout << "调用拷贝构造函数创建d,深复制,更改c值后,d值不会变:";
	c.alter(789);
	d.show();

	cout << "重载+号(char *):";
    c + s;
	c.show();

	cout << "重载+号(char):";
	c + '!';
	c.show();

	cout << "重载+号(MyString):";
	c + d;
	c.show();

	cout << "重载=号(char *):";
	c =s;
	c.show();

	cout << "重载=号(MyString):";
	c = d;
	c.show();

	cout << "重载[]号:"<<c[2]<<endl;
	
	system("PAUSE");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值