【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>

运行结果:

时间: 2024-10-19 21:42:51

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

设计String类,并且在String类中使用运算符重载

passport.baidu.com/?business&un=%E6%B5%8E%E5%8D%97%E5%93%AA%E6%9C%89%E5%A4%9C%E6%83%85%E4%B8%80#0 passport.baidu.com/?business&un=%E6%B5%8E%E5%8D%97%5F%E7%BE%8E%E5%A5%B3%E6%8C%89%E6%91%A9#0 passport.baidu.com/?business&un=%E5%8D%97%E9%98%B3%5F

第九周项目1-复数类中的运算符重载(续)

在复数类中的运算符重载基础上 (1)再定义一目运算符 -,-c相当于0-c. (2)定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年05月14日 * 版本号:v1.0 */ #include <iostream> using

第九周项目2-Time类中的运算符重载(续)

在Time类中的运算符重载基础上 (1)定义对时间对象的自增和自减一目运算符 (2)定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年05月14日 * 版本号:v1.0 */ #include <iostream> using n

第九周项目3-分数类中的运算符重载(续)

在分数类中的运算符重载基础上 (1)定义分数的一目运算+和-,分别代表分数取正和求反,将"按位取反运算符"~重载为分数的求倒数运算. (2)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年05月14日 * 版本号:v1.0 *

第八周项目3-分数类中的运算符重载

实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简).比较(6种关系)的运算.可以在第4周分数类代码的基础上开始工作. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年04月29日 * 版本号:v1.0 */ #include <iostream> using namespace std; class CFraction { private:

第八周项目 二 【项目2-Time类中的运算符重载】

[项目2-Time类中的运算符重载] 实现Time类中的运算符重载. [cpp] view plaincopyprint? class CTime { private: unsigned short int hour;    // 时 unsigned short int minute;  // 分 unsigned short int second;  // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,i

设计CTime类,并且在CTime类中使用运算符重载

程序代码: #include <iostream> using namespace std; class CTime//时间类 { private: unsigned short int hour; //时 unsigned short int minute; //分 unsigned short int second; //秒 public: CTime(int h=0,int m=0,int s=0);//构造函数 void setTime(int h,int m,int s);//设置时

第九周项目二-Time类中的运算符重载(续)

<span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">在Time类中的运算符重载基础上</span><br style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15px; line-height:

分数类中的运算符重载(续)

输入代码: /* *Copyright (c)2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:sum123.cpp *作 者:林海云 *完成日期:2015年5月23日 *版 本 号:v2.0 * *问题描述:在分数类中的运算符重载基础上 (1)定义分数的一目运算+和-,分别代表分数取正和求反,将"按位取反运算符"~重载为分数的求倒数运算. (2)定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运