【C++】String类中的运算符重载
模块化设计:
头文件:
- <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类中的运算符重载的更多相关文章
- C++走向远洋——50(Time类中的运算符重载、一目,二目比较运算符、二目赋值运算符、二目加减法运算符)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——48(项目一1、复数类中的运算符重载、类的成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- string类中运算符重载实现
C++中预定义的加.减等运算符的操作对象只能是基本的数据类型.如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载 ...
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
- String类中常用的操作
一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...
- Java——String类中的compareTo方法总结
String类的定义: java.lang 类 String java.lang.Object java.lang.String 所有已实现的接口:Serializable, C ...
- 编码实现字符串类CNString实现运算符重载
题目描述: 编码实现字符串类CNString,该类有默认构造函数.类的拷贝函数.类的析构函数及运算符重载,需实现以下"="运算符."+"运算."[]& ...
- C++解析(16):友元与类中的函数重载
0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...
随机推荐
- 纯JS监听document是否加载完成
欢迎加入前端交流群交流知识&&获取视频资料:749539640 概述 一个document 的 Document.readyState 属性描述了文档的加载状态. 一个文档的 read ...
- [Javascript] 5个最佳的Javascript日期处理类库
在大家日常网站开发和web应用开发中,我们往往需要有效的调用Javascript处理日期和时间格式相关的函数,在Javascript中已经包含了部分最基本的内建处理方法. 在大家日常网站开发和web应 ...
- Css float 盒子模型 position
属性: float 浮动 浮动的内容用div包起来,给div设置宽高 clear 清除浮动. box-sizing 标准模式下的盒模型 content-box:(默认属性) padding和borde ...
- (整)deepin下mysql的安装与部分错误解决办法
deepin(深度)是国产Linux系统,程序员肯定要了解Linux系统啦,但是在程序安装上可能会有些不习惯,现在让我们来看看mysql在deepin上的安装过程. 1.傻瓜式命令行安装 这也是Lin ...
- Android-crop:漂亮的图片裁切工具
主要特点 Gradle构建和AAR 现代化的UI 向后兼容到SDK 10 配置简单 示例项目 使用 首先,在你的 manifest 文件中申明 CropImageActivity : <acti ...
- Spring 获取propertise文件中的值
Spring 获取propertise文件中的值 Spring 获取propertise的方式,除了之前的博文提到的使用@value的注解注入之外,还可以通过编码的方式获取,这里主要说的是要使用Emb ...
- echarts 纵坐标数字太长显示补全,以及文字倾斜显示
如上数字太长,显示补全,以及x坐标的月份当数量大的时候也会显示补全: x可以调节纵坐标label的宽度 y2可以调节横坐标label的高度 grid: { x: 100, //默认是80px y: 6 ...
- 杭电 2035 人见人爱A^B【快速幂取模】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2035 解题思路:这一题数据不大,可以用同余来做,也可以用快速幂来做 反思:定义成 #include&l ...
- 杭电 2035 人见人爱A^B【同余】
#include<stdio.h> int main() { int a,b; int s; int i; while(scanf("%d %d",&a,&am ...
- JS 九九运算表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...