1、MyString.h 头文件

#pragma once

#include <iostream>
using namespace std; class MyString
{
public:
MyString();
MyString(const char *p);
MyString(const MyString& s);
~MyString(); public:
MyString& operator=(const char* p);
MyString& operator=(const MyString &s);
char& operator[](int index);
// 重载左移操作符、右移操作符,注意区别
friend ostream& operator<<(ostream &out, MyString &s);
friend istream& operator>>(istream &in, MyString &s);
//重载双等号和不等号
bool operator==(const char* p);
bool operator!=(const char* p);
bool operator==(const MyString& s );
bool operator!=(const MyString& s);
//重载大于和小于操作符
int operator<(const char* p);
int operator>(const char* p);
int operator<(const MyString &s);
int operator>(const MyString &s); // 把类的指针 单独使用,通过 s1.c_str() 来调用
char *c_str()
{
return m_p;
} private:
int m_len;
char *m_p;
};

2、MyString.cpp 函数实现文件

#define  _CRT_SECURE_NO_WARNINGS
#include "MyString.h" MyString::MyString()
{
m_len = ;
m_p = new char[m_len + ];
strcpy(m_p, "");
} MyString::MyString(const char *p)
{
if (p == NULL)
{
m_len = ;
m_p = new char[m_len + ];
strcpy(m_p, "");
}
else
{
m_len = strlen(p);
m_p = new char[m_len + ];
strcpy(m_p, p);
}
} //MyString s3 = s2;
MyString::MyString(const MyString& s)
{
m_len = s.m_len;
m_p = new char[m_len + ];
strcpy(m_p, s.m_p);
} MyString::~MyString()
{
if (m_p != NULL)
{
delete[]m_p;
m_p = NULL;
m_len = ;
}
} MyString& MyString::operator=(const char* p)
{
if (m_p != nullptr)//释放旧的内存
{
delete[] m_p;
m_len = ;
}
if (p == NULL) //根据p分配新的内存
{
m_len = ;
m_p = new char[m_len + ];
strcpy(m_p, "");
}
else
{
m_len = strlen(p);
m_p = new char[m_len + ];
strcpy(m_p, p);
}
return *this;
}
MyString& MyString::operator=(const MyString &s)
{
if (m_p != nullptr)//释放旧的内存
{
delete[] m_p;
m_len = ;
}
m_len = strlen(s.m_p);
m_p = new char[s.m_len + ];
strcpy(m_p, s.m_p);
return *this;
} char& MyString::operator[](int index)
{
return m_p[index];
} ostream& operator<<(ostream &out, MyString &s)
{
out << s.m_p;
return out;
}
istream& operator>>(istream &in, MyString &s) {
cin >> s.m_p;
return in;
} bool MyString::operator==(const char* p)
{
if (p == nullptr)
{
if (m_len != )
{
return false;
}
else
return true;
}
else
{
if (m_len == strlen(p))
{
return !strcmp(m_p, p);
}
else
return false;
}
}
bool MyString::operator!=(const char *p)
{
return !(*this == p);
} bool MyString::operator==(const MyString& s)
{
if (m_len != s.m_len)
return false;
return strcmp(m_p,s.m_p);
}
bool MyString::operator!=(const MyString& s)
{
return !(*this == s);
}
//if(s3<"bb"")
int MyString::operator<(const char* p){
return strcmp(m_p, p);
}
int MyString::operator>(const char* p) {
return strcmp(p, m_p);
}
int MyString::operator<(const MyString &s) {
return strcmp(m_p, s.m_p);
}
int MyString::operator>(const MyString &s) {
return strcmp(s.m_p, m_p);
}

3、test.cpp 测试文件

#include <iostream>
using namespace std;
#include "MyString.h" //void main01()
//{
// MyString s1;
// MyString s2("s2");
// MyString s2_2 = NULL;
// MyString s3 = s2;
//
// MyString s4 = "s4";
// s4 = s2;
// s4[1] = '9';
// cout << s4[1] << endl;
// cout << s4 << endl;//左移操作符的重载
//
// system("pause");
//}
void main()
{
MyString s1;
MyString s2("s2");
MyString s3 = NULL;
cout << (s2 > "s") << endl;
cin >> s2;
cout << s2 << endl;
system("pause");
}

C++(三十七) — 字符串的函数重载—案例的更多相关文章

  1. php 之 类,对象(三)多态性,函数重载,克隆

    一.三大特性之三 多态性(在php中表象不明显)1.概念:当父类引用指向子类实例时,由于子类对父类函数进行了重写,导致我们在使用该引用去调用相应的方法显示出的不同.2.发生条件:1.必须有继承 2. ...

  2. python的基本用法(三)字符串常用函数

    字符串常用函数 # s='.abcd.'# new_s=s.strip('.')#默认去掉字符串两边的空格和换行符,想去掉什么括号中就写什么# print('s',s)# print('new_s', ...

  3. SQLServer截取字符串常用函数

    SQL Server中一共提供了三个字符串截取函数:LEFT().RIGHT().SUBSTRING(). 一.LEFT()函数 函数说明如下: 语法:LEFT(character,integer). ...

  4. Sql server函数的学习2(游标函数、日期函数、字符串操纵函数)

    一.游标函数与变量 游标可以处理多行数据,在过程循环中一次访问一行.和基于集合的高效操作相比,这个功能对系统资源的消耗更大. 可以用一个函数和两个全局变量来管理游标操作 1.CURSOR_STATUS ...

  5. PHP视频教程 字符串处理函数(三)

    字符串替换函数: str_replace() 替换字符串或数组元素,区分大小,第四个参数可选用于统计替换次数. str_ireplace() 不区分大小写替换 字符串函数比较 strcmp()比较字符 ...

  6. Javascript函数重载,存在呢—还是存在呢?

    1.What's is 函数重载? );//Here is int 10 print("ten");//Here is string ten } 可以发现在C++中会根据参数的类型 ...

  7. JS魔法堂:函数重载 之 获取变量的数据类型

    Brief 有时我们需要根据入参的数据类型来决定调用哪个函数实现,就是说所谓的函数重载(function overloading).因为JS没有内置函数重载的特性,正好给机会我们思考和实现一套这样的机 ...

  8. C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成

    这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...

  9. c++函数重载---2

    原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 写在前面: 函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函 ...

随机推荐

  1. Docker学习-安装,配置,运行

    Docker继续学习 2019年12月15日23:15:36 第二次学习docker Docker三个重要概念: 镜像 就是一个模板(类似一个Java类) 容器 容器是用镜像创建的运行实例. 仓库 仓 ...

  2. 看看这5个最容易犯的Java错误,你犯了没?

    人非圣贤,孰能无过.都说Java语言是一门简单的编程语言,基于C++演化而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错.那么对于广大的Java程序员来说,它们最容易犯的几个错 ...

  3. Git设定不合并的文件

    一个最简单的做法,通过添加.gitattributes文件来完成 1 在要被合并的分支中设置 git config --global merge.ours.driver true设置git配置项mer ...

  4. hashMap的源码实现

    1.初步认识hashMap public static void main(String[] args) { HashMap<String, Integer> map = new Hash ...

  5. AR*客户地点分配OU

    DECLARE p_cust_acct_site_rec hz_cust_account_site_v2pub.cust_acct_site_rec_type; p_cust_site_use_rec ...

  6. 使用JMeter进行Apache Kafka负载测试

    1.卡夫卡负载测试 在这个Apache Kafka教程中,我们将了解如何使用Apache JMeter,如何在Apache Kafka上执行Kafka负载测试.此外,这个Kafka负载测试教程教我们如 ...

  7. Java 8 Optional 的用法

    认识Optional   Optionals是用于防止 NullPointerException 的漂亮工具.让我们快速了解一下Optionals的工作原理. Optional 是一个简单的容器,其值 ...

  8. 13 IO流(十)——BufferedReader/BufferedWriter 装饰流

    Buffered字符包装流 与Buffered字节装饰流一样,只不过是对字符流进行包装. 需要注意的地方 Buffered字符流在Reader与Writer上有两个新的方法:String readLi ...

  9. Mac上go的下载安装教程

    mac上go的下载安装教程 官网https://golang.google.cn/dl/下载,安装 环境变量配置 参考https://www.jianshu.com/p/5c1873eaf3ca Ba ...

  10. 【LEETCODE】47、985. Sum of Even Numbers After Queries

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...