当前位置: 首页 > article >正文

重载C++运算符

题目

实现一个通过重载以下运算符来执行字符串操作的类:<<、>>、= 和 ==。例如,考虑以下代码:

StrShift example;

example = “hello world!”;

printf(“\”example << 2\” 的结果为 %s\n“, example << 2); 在上述代码中,输出将是“llo world!he”,这显示了字符串“hello world!”的最后两个字符向左旋转到了字符串的前面。请注意,状态是保持的,因此两次调用 example << 1 将得到与一次调用 example << 2 相同的结果。

解题方案:

#include <iostream>
#include <cstring>
using namespace std;

class String
{
public:
        String();
        String(int len);
        String(const char* str);
        String(const String &other);
 
	String& operator=(const String& other);
	bool operator==(String& other);
	char* operator<<(int n);
	char* operator>>(int n);
	
	~String();
 
private:
	int length;
	char* str;
};

String::String()
{
    this->length = 0;
    this->str = NULL;
}
 
String::String(int len)
{
    this->length = len;
    this->str = new char[len];
    memset(this->str, 0, len);
}

String::String(const char* str)
{
    if (str == NULL)
    {
        this->length = 0;
        this->str = new char[1];
        strcpy(this->str, "");
        return;
    }
    this->length = strlen(str);
    this->str = new char[this->length + 1];
    strcpy(this->str, str);
 
}

String::String(const String & other)
{
    this->length = other.length;
    this->str = new char[this->length+1];
    strcpy(this->str, other.str);
}


String & String::operator=(const String & other)
{
    if (this == &other)
    {
        return *this;
    }
 
    if (this->str != NULL)
    {
        delete[] this->str;
        this->str = NULL;
        this->length = 0;
    }
 
    this->length = other.length;
    this->str = new char[this->length + 1];
    strcpy(this->str, other.str);
    return *this;
}

bool String::operator==(String & other)
{
    if (this == &other)
    {
        return true;
    }
    if (this->length != other.length)
    {
        return false;
    }
    if (strcmp(this->str, other.str) != 0)
    {
        return false;
    }
	return true;
}
 
char* String::operator<<(int n)
{
    if(this->str != NULL)
    {
        String str = *this;
	for(int i = 0; i < this->length; i++)
	{
            this->str[i] = str.str[(this->length - n + i)%(this->length)];
	}
        return this->str;
    }
 
    return NULL;
}

char* String::operator>>(int n)
{
    if(this->str != NULL)
    {
        String str = *this;
	for(int i = 0; i < this->length; i++)
	{
            this->str[i] = str.str[(n + i)%(this->length)];
	}
        return this->str;
    }
 
    return NULL;
}

String::~String()
{
    if (this->str != NULL)
    {
        delete[] this->str;
        this->str = NULL;
        this->length = 0;
    }
}

int main(int argc, char *argv[])
{
    String example("hello world!");
    String str1 = example;
    printf (" \" example << 2\" result in %s\n ", (example >> 2));
    printf (" \" example >> 2\" result in %s %s\n ", (example << 1),(example << 1));
    return 0;
}

测试

在这里插入图片描述


http://www.kler.cn/a/516668.html

相关文章:

  • 设计模式的艺术-职责链模式
  • 激光雷达和相机早期融合
  • 青少年CTF练习平台 贪吃蛇
  • 图谱之前端关系应用
  • 在elasticsearch中,document数据的写入流程如何?
  • 学到一些小知识关于Maven 与 logback 与 jpa 日志
  • salesforce FIELD_FILTER_VALIDATION_EXCEPTION
  • LVGL+FreeRTOS实战项目:智能健康助手(蓝牙模块篇)
  • 假期day1
  • NPM 与 Node.js 版本兼容问题:npm warn cli npm does not support Node.js
  • 文献阅读 250123-Accelerated dryland expansion under climate change
  • 从 TCP/IP 演进看按序流与性能
  • tortoiseSVN图标缺少绿色钩/tortoiseSVN图标不显示解决方案
  • EDI安全:2025年数据保护与隐私威胁应对策略
  • 【面试】Java 记录一次面试过程 三年工作经验
  • git rebase的使用
  • 在K8S中使用Values文件定制不同环境下的应用配置详解
  • ArrayFire异构计算
  • YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等
  • C++ 入门速通-第1章【黑马】
  • smb共享文件夹当被共享文件的电脑关机了还能正常获取文件吗
  • linux系统centos版本上安装mysql5.7
  • Excel表格转换成PDF文件时显示不全怎么处理?
  • 绘制决策树的尝试1
  • Linux下的编辑器 —— vim
  • QTableView和QTableWidget的关系与区别