前言:刚学习c++,老师布置了两次试验任务用来测试重载运算符的学习情况,分享一下我的内容,望路过的各位不吝赐教。
一、实验基本要求:
设计字符串操作类String,
1.重载+运算符实现两个字符串拼接(支持连加)
2.重载单目运算符+/-实现返回纯大写/小写字符串
3.重载~(非符号)实现返回大小写切换后的字符串。
以下代码参考了b站一位up主的教学视频,贴上地址
#include<iostream>
#include<cstringt.h>
#include<string.h>
using namespace std;
class CString
{
private:
char* m_str;
public:
//有参构造函数赋值
CString(const char* str)
{
//动态内存分配
m_str = new char[strlen(str) + 1];
//赋值
strcpy(m_str, str);
}
//析构函数
~CString()
//判断是否占用内存空间
{
if (m_str)
{
//内存释放
delete[]m_str;
}
}
//拷贝构造函数
CString(const CString& other)
{
if (this != &other)
{
m_str = new char[strlen(other.m_str)+1];
strcpy(m_str, other.m_str);
}
//调用情况:
//1.用一个对象去初始化另一个对象
//2.函数参数是类的对象的时候,且是传值而不是引用
//3.当函数返回值是其他对象时
}
//重载“+”号运算符,本质实现的是两个类对象相加
CString operator+(const CString& other_str)
//直接采用实参,提高效率
{
//判断,分动态配内存,返回
int len1 = strlen(m_str);
int len2 = strlen(other_str.m_str);
char* temp = new char[len1 + len2];
strcpy(temp, m_str);//将m_str拷贝赋值到temp中
strcat(temp, other_str.m_str);//将other链接到temp中
CString x(temp);//返回值类型是CString,temp表示的是字符型指针,因此进行替换返回
return x;//3.x属于其他的对象
}
//获取x的值
const char* getstr() const
{
return m_str;
}
};
//沿用第一种方式,进行“++”与“--”单目运算符的重载
class NString
{
private:
char* m1_str;
public:
//有参构造函数赋值
NString(const char* str)
{
//动态内存分配
m1_str = new char[strlen(str)+1];
//赋值
strcpy(m1_str, str);
}
//析构函数
~NString()
//判断是否占用内存空间
{
if (m1_str)
{
//内存释放
delete[]m1_str;
}
}
//拷贝构造函数
NString(const NString& other)
{
if (this != &other)
{
m1_str = new char[strlen(other.m1_str)+1];
strcpy(m1_str, other.m1_str);
}
}
//重载“++”号运算符,实现大写转化
NString operator++(int)
{
int len1 = strlen(m1_str)+1;
char* temp = new char[len1];
//采用循环进行遍历,实现转化功能
for (int i = 0; i < len1; i++)
{
temp[i] = toupper(m1_str[i]);//toupper()函数:小写转大写
}
NString x(temp);
return x;
}
const char* getstr1() const
{
return m1_str;
}
//重载“--”号运算符,实现小写转化
NString operator--(int)
{
int len1 = strlen(m1_str)+1;
char* temp = new char[len1];
//采用遍历转化
for (int i = 0; i < len1; i++)
{
temp[i] = tolower(m1_str[i]);//tolower()函数:大写转小写
}
NString x(temp);
return x;
}
const char* getstr2() const
{
return m1_str;
}
};
//继续沿用第一种定义方式,改变重载定义即可
class MString
{
private:
char* m2_str;
public:
//有参构造函数赋值
MString(const char* str)
{
//动态内存分配
m2_str = new char[strlen(str) + 1];
//赋值
strcpy(m2_str, str);
}
//析构函数
~MString()
//判断是否占用内存空间
{
if (m2_str)
{
//内存释放
delete[]m2_str;
}
}
//拷贝构造函数
MString(const MString& other)
{
if (this != &other)
{
m2_str = new char[strlen(other.m2_str) + 1];
strcpy(m2_str, other.m2_str);
}
}
//重载“~”号运算符,实现大小写相互转化
friend MString operator~(const MString& other_str)
{
int len1 = strlen(other_str.m2_str) + 1;
char* temp = new char[len1];
strcpy(temp, other_str.m2_str);
//采用循环进行遍历,实现转化功能
for (int i = 0; i < len1; i++)
{
if (isupper(temp[i]))
{
temp[i] = tolower(temp[i]);
}
else
temp[i] = toupper(temp[i]);
}
MString x(temp);
return x;
}
const char* getstr3() const
{
return m2_str;
}
};
int main()
{
CString one("abc");
CString two("def");
CString three = one + two;
cout << three.getstr() << endl;
NString four("ght");
NString five = four ++;
NString six("ASDAS");
NString seven =six--;
cout << five.getstr1() << endl;
cout << seven.getstr2() << endl;
MString nine("abcdFDHA");
MString ten = ~nine;
cout << ten.getstr3() << endl;
}
二、重载[]运算符,因为分了两次实验,所以这个单列出来了:
针对String类,通过重载[]运算符实现求子串操作:
对于字符串对象S,String S=”abcdefg”
S[“2:6”]能得到包含下标2到5之间的子串“cdef”相对应的String对象
,S[“2:”]能得到从下标2起到最末尾的子串“cdefg”
S[“:4”]能得到从字符串开始到下标4之前的子串“abc”
代码如下:
#include<iostream>
#include<cstringt.h>
#include<string.h>
using namespace std;
class QString
{
private:
int x, y;
char* m_str;
public:
QString(const char* str)
{
m_str = new char[strlen(str)+1];
strcpy(m_str, str);
}
~QString()
{
if (m_str)
{
delete[]m_str;
}
}
QString(const QString& other)
{
if (this != &other)
{
m_str = new char[strlen(other.m_str) + 1];
strcpy(m_str, other.m_str);
}
}
//重载“[]”号运算符,实现的截取子串
QString operator[](const char a[4])
{
int len1 = strlen(m_str),len=0;
//ASCII码转换
int x = (int)a[0] - '0';
if (a[0] == ' ')
x = x + 16;
int y = (int)a[2] - '0';
//注意不同情况内存要变换
if (a[2] == ' ')
{
len = len1-x-1;
}
else
{
len = y - x;
}
//分配内存
char* temp = new char[len-1];
char* temp1 = new char[len1+1];
strcpy(temp1, m_str);
//不同情况下的判断,这里用了比较简单的循环,高级的暂时...
//("2,6")
if (a[0] > ' ' && a[2] > ' ')
{
for (int i = 0, n = x; i < len; i++, n++)
{
temp[i] = temp1[n];
}
}
//(" ,6")
else if (a[0] <= ' ' && a[2] >= ' ')
{
for (int i = 0; i < len; i++)
{
temp[i] = temp1[i];
}
}
//("2, ")
else if (a[0] >=' '&& a[2] <= ' ')
{
for (int i = x,n=0; i < len1 ;n++,i++)
{
temp[n] = temp1[i];
}
}
QString q(temp);
return q;
}
const char* getstr() const
{
return m_str;
}
};
int main()
{
QString s("sawdsawdsa");
QString s1 = s[("2, ")];
cout << s1.getstr() << endl;
QString s2 = s[("2,6")];
cout << s2.getstr() << endl;
QString s3 = s[(" ,6")];
cout << s3.getstr() << endl;
}
tips:作为刚学习编程的小菜鸟,以上代码仍然存在问题,好像是内存分配上有错误,导致编译出来的结果会出现有乱码的情况。如果有路过的小伙伴知道的话,可以评论留言,今天分享就到这了,谢谢观看。