编写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;
}