模块化设计:

头文件:

<span style="font-size:18px;">
#ifndef operator_operator_h
#define operator_operator_h #include <iostream>
#include <string> using namespace std; class MyString
{
public:
//三个重载的构造函数
MyString();
MyString(const char* str);
MyString(const MyString& str);
//析构函数
~MyString(); //重载运算符
MyString& operator = (const MyString& str);
char& operator[](int index);//訪问下标
friend ostream& operator << (ostream& out, const MyString& str); //重载输出操作符
friend istream& operator >> (istream& in, MyString& str); //重载输入操作符
friend MyString operator + (const MyString& str1, const MyString& str2); //重载加号操作符。注意返回引用不行
friend MyString operator += (MyString& str1, const MyString& str2); //重载+=操作符
friend bool operator == (const MyString& str1, const MyString& str2); //重载相等操作符
friend bool operator != (const MyString& str1, const MyString& str2); //重载不相等操作符 private:
char* p;
int len;
}; #endif;
</span>

功能函数:

<span style="font-size:18px;">
#include "operator.h"

//默认构造函数,初始化为空串
MyString::MyString()
{
len = 0;
p = new char[len + 1];
p[0] = '\0';
} //构造函数,用一个字符串初始化
MyString::MyString(const char* str)
{
len = strlen(str);
p = new char[strlen(str) + 1];
strcpy_s(p, strlen(str) + 1, str);
} //拷贝构造函数,用另外一个string初始化
MyString::MyString(const MyString& str)
{
len = str.len;
p = new char[strlen(str.p) + 4];
strcpy_s(p, strlen(str.p) + 1, str.p);
} //析构函数
MyString::~MyString()
{
delete[] p;
} //重载赋值操作符( = )
MyString& MyString::operator = (const MyString& str)
{
if (this->p == str.p)
{
return *this;
}
delete[] p;
len = str.len;
p = new char[len + 1];
strcpy_s(p, len + 1, str.p);
return *this;
} //重载输出操作符( << )
ostream& operator << (ostream& out, const MyString& str)
{
out << str.p;
return out;
} //重载输入操作符( >> )
istream& operator >> (istream& in, MyString& str)
{
in >> str.p;
return in; } //重载加号操作符( + )
MyString operator + (const MyString& str1, const MyString& str2)
{
MyString str;
delete[] str.p;
str.len = str1.len + str2.len;
str.p = new char[str.len + 1];
strcpy_s(str.p, str.len + 1, str1.p);
strcat_s(str.p, str.len + 1, str2.p);
return str;
} //重载相加赋值操作符( += )
MyString operator += (MyString& str1, const MyString& str2)
{
str1 = str1 + str2;
return str1;
} //重载相等操作符
bool operator == (const MyString& str1, const MyString& str2)
{
if (strcmp(str1.p, str2.p) == 0)
{
return true;
}
return false;
} //重载不相等操作符
bool operator != (const MyString& str1, const MyString& str2)
{
if (strcmp(str1.p, str2.p) == 0)
{
return false;
}
return true;
} //重载下标([])
char& MyString::operator[](int index)
{
return p[index];
} </span>

測试程序:

<span style="font-size:18px;">
#include "operator.h" int main()
{
MyString mystr("asfasgdhf"); //測试构造函数,用一个字符串初始化 cout << mystr[2] << endl; mystr[4] = 'd'; cout << mystr <<endl; MyString mystr2(mystr); //用另外一个string初始化 cout << mystr2 << endl; MyString mystr3; mystr3 = mystr + mystr2; //測试加号运算符,測试赋值运算符 cout << mystr + mystr2 << endl; mystr3 += mystr; //測试+=运算符 cout << mystr3 << endl; cout << (mystr == mystr2) << endl; //測试 == cout << (mystr != mystr3) << endl; //測试 。= MyString mystr4; cout << "Input a series characters, end of ctrl+z." << endl; cin >> mystr4; //測试重载的输入符号( >> ) cout << mystr4 << endl; return 0;
}
</span>

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSXJlYW5fTGF1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

【C++】String类中的运算符重载的更多相关文章

  1. C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  2. C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  3. C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. string类中运算符重载实现

    C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...

  5. C++中的运算符重载注意事项

    1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...

  6. String类中常用的操作

    一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...

  7. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  8. 编码实现字符串类CNString实现运算符重载

    题目描述: 编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下"="运算符."+"运算."[]& ...

  9. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

随机推荐

  1. codeforces 712 Memory and De-Evolution

    2019-05-19 13:25:37 加油,加油,坚持,坚持!!! 一定要逆推,才可以是最少的次数 更好的方法: https://www.cnblogs.com/ECJTUACM-873284962 ...

  2. vue1.0.js的初步学习

    vue.js是一个mvvm框架 {{.....}}   常用模板渲染方式 v-model  :将对应变量的值的变化反映到input的vaule中 vue.js 的一个组件 .vue文件包含<te ...

  3. 部署Seafile服务

    介绍 官网:https://www.seafile.com 客户端/服务端下载:https://www.seafile.com/download/ 中文安装教程(MySQL版):http://manu ...

  4. 关于VS 2013连接Microsoft Access 2013的相关问题

      ①   下载安装Microsoft Access Database Engine 2010 Redistributable(28MB),共有32bit(下载)和64bit(下载)两个版本,具体要安 ...

  5. Visual Studio 编辑代码量大的文件时分屏技巧

  6. 京东专业“卖”队友,魅族手环将亮相1206魅蓝note新品发布会

    京东一直是国内顶级的数码产品自营销售渠道,但是,正因为庞大的数据体系和平台特殊性,经常会帮我们发现一些“好玩的”保密性较高的东西,譬如价格.信息.谍照等.而在最新上线的京东超级品牌日活动页面上,专业“ ...

  7. BZOJ 1266: [AHOI2006]上学路线route Floyd_最小割

    十分简单的一道题. 图这么小,跑一边 Floyd 就得到第一问最短路径的答案. 考虑第二问怎么求:我们可以先将最短路径组成的图从原图中抽离出来,构成新图 $G$. 我们发现,只要 $G$ 的起点与终点 ...

  8. 【Git教程】Git教程及使用命令

      Git是目前世界上最先进的分布式版本控制系统,可以自动记录和管理文件的改动,还可以团队写作编辑,也就是帮助我们对不同的版本进行控制.2008年,GitHub网站上线,为开源项目提供免费存储,迅速发 ...

  9. PHP 中 call_user_func 的使用

    call_user_func函数类似于一种特别的调用函数的方法,使用方法如下 第一种情况: function set_max($a,$b) { if($a>$b) echo $a; else e ...

  10. gpio_request 原形代码

    http://blog.csdn.net/maopig/article/details/7428561 其原型为 int gpio_request(unsigned gpio, const char ...