运算符重载:string类

news/2024/7/6 1:15:14

运算符重载规则如下:

①、 C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。
②、 重载之后运算符的优先级和结合性都不会改变。
③、 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。

不能重载的运算符只有五个:

它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。

运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。

运算符重载为类的成员函数的一般语法形式为:
函数类型 operator 运算符(形参表)
{
函数体;
}
运算符重载为类的友元函数的一般语法形式为:
friend 函数类型 operator 运算符(形参表)
{
函数体;
}
其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。

参考代码如下:

class String
{
public:

//构造

String(char* pstring)  //构造
	{
		pstr = new char[strlen(pstring) + 1]();
		strcpy(pstr, pstring);
	}

//类内是this_call的调用约定,成员方法隐藏this指针,指向一般为左操作数,所以只用传右操作数即可

String(const String& rhs)
{
	pstr = new char[strlen(rhs.pstr) + 1]();
	strcpy(pstr, rhs.pstr);
}

类内=(赋值)的重载,左右操作数类型均为String,类内只用传右操作数即可

String& operator=(const String& rhs)
{
	if (this != &rhs)
	{
		delete[] pstr;
		pstr = new char[strlen(rhs.pstr) + 1]();
		strcpy(pstr, rhs.pstr);
	}
	return *this;
}

//析构

~String()
{
	delete[] pstr;
	pstr = NULL;
}

类内实现+的重载,传入右操作数类型为char*(可省略:char*可隐式生成临时对象,调用左右操作数都为string类的重载函数)

//const String operator+(char* prhs)
//{
//	char* pnewstr = new char[strlen(pstr) + strlen(prhs) + 1]();
//	strcat(pnewstr, pstr);
//	strcat(pnewstr, prhs);
//	String tmp(pnewstr);
//	delete[] pnewstr;
//	return tmp;
//}

String str2 = str1 + “world”;//“helloworld” +是自左向右,可根据str1.推演str2的类型
String str3 = “hi” + str1;//“hihello”;错误,不能根据右边类型推演左边类型,只能调用左操作符为char*,右操作符为string的函数,或者两个类型都是string 的函数

类内==的重载,左右操作数类型均为String,类内只用传右操作数即可

bool operator==(const String& rhs)
{
	return strcmp(pstr, rhs.pstr) == 0;
}

if (str1 == str2)
{
std::cout << str1[0] << std::endl;// int p[10] ==> p int* p[1]
}

类内[]的重载,左操作数类型为String,右操作数类型为int,类内只用传右操作数即可

char& operator[](int index)
{ 
	return pstr[index];
}

std::cout << str1[0] << std::endl;// int p[10] ==> p int* p[1]

类内<的重载,左操作数类型为std::cout,右操作数类型为String,类内只用传右操作数即可

bool operator<(const String& rhs)
{
	return strcmp(pstr, rhs.pstr) < 0;
}

if (str2 < str2)
{
std::cout << str2 << std::endl;
}

private:

char* pstr;

//类外不能访问类内的私有成员变量,设置友元函数

 friend const String operator+(char*, const String&);
    	friend const String operator+(const String&, const String&);
    	friend std::ostream& operator <<(std::ostream&, const String&);

};

//类外是cd_call的调用约定,无this指针,需传两个对象

//类外实现+的重载,左操作数类型为char*,右操作数为String(可省略:char*可先调用构造生成临时对象,后调用左右操作数都为string类的重载函数)

//const String operator+(char* plhs, const String& rhs)
//{
//	char* pnewstr = new char[strlen(plhs) + strlen(rhs.pstr) + 1]();
//	strcat(pnewstr, plhs);
//	strcat(pnewstr, rhs.pstr);
//	String tmp(pnewstr);
//	delete[] pnewstr;
//	return tmp;
//}

String str3 = “hi” + str1;//“hihello”;

类外实现+的重载,左右操作数类型均为String

const String operator+(const String& lhs, const String& rhs)
{
	char* pnewstr = new char[strlen(lhs.pstr) + strlen(rhs.pstr) + 1]();
	strcat(pnewstr, lhs.pstr);
	strcat(pnewstr, rhs.pstr);
	String tmp(pnewstr);
	delete[] pnewstr;
	return tmp;
}

String str4 = str1 + str2; //“hellohelloworld”

类外实现<<的重载,左操作数为std::ostream的类型,右操作数为String类型

std::ostream& operator <<(std::ostream& out, const String& rhs)
{
	out << rhs.pstr;
	return out;
}

http://www.niftyadmin.cn/n/4058287.html

相关文章

10个方法提高你的编程生产力 转载

我在google工作过&#xff0c;现在有了自己的公司&#xff0c;多年的程序员工作经验告诉我&#xff0c;如果有一个良好的工作习惯&#xff0c;能够极大提高你的工作效率。以下是我的建议&#xff0c;如果你长时间坚持这样做&#xff0c;一年到两年时间&#xff0c;你发现你能够…

css sprites-简单实例让你快速掌握css sprites精髓

这段时间有几次接触到了css sprites的概念&#xff0c;一个就是在用css做滑动门的时候&#xff0c;另外一个就是在用YSlow分析网站性能的时候&#xff0c;于是对css sprites这个概念产生了浓厚的兴趣。在网上查找了很多的资料&#xff0c;但可惜的是大部分都是只言片语&#xf…

SCAU 概率论 期末复习(开卷)

说明&#xff1a;由于考试是上机开卷&#xff0c;所以下面写出了求值的代码&#xff08;java&#xff09;&#xff0c;考试的时候可以直接输入数据即可获得答案。 第四章 1.求下四分位&#xff0c;中位数和上四分位 package com.company;import java.util.Arrays; import ja…

远程访问大华摄像头_通过WEB调用大华网络摄像头

通过WEB调用大华网络摄像头1.要调用的大华摄像头为Dahua 大华DH-IPC-HFW2100P-0600B 网络摄像机 (白色)&#xff0c;摄像头外形如下图所示2.调用效果如下图所示4.解压OCX包单击文件中的reg.bat注册dll5.新建index.html关输入以下代码视频控件body {font-family:"", a…

面试题14:剪绳子(动态规划,贪心算法)

一、题目&#xff1a; 一根长度为n的绳子&#xff0c;剪成m段,m,n都大于1&#xff0c;且都为整数,每段长度记为k[0],k[1]…,k[m].求k[0]*k[1]…*k[m]可能的最大乘积 1.1解法&#xff1a; 两种不同的方法解决这个问题&#xff0c;先用常规的需要O(n)时间和O(n)空间的动态规划…

python re模块导入_Python正则re模块使用步骤及原理解析

python中使用正则表达式的步骤&#xff1a;1.导入re模块&#xff1a;import re2.初始化一个Regex对象&#xff1a;re.compile()3.刚刚创建的Regex对象调用search方法进行匹配&#xff0c;返回要给March对象4.刚刚的March对象调用group方法&#xff0c;展示匹配到的字符串下面例…

面试题4:二维数组的查找

一、题目 在一个二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序。每一列都按照从上到下递增的顺序排序&#xff0c;请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组是否含有该整数。 二、算法分析 一个从左到右&#xff0c;从…

6脉冲触发器脉冲缺失_脉冲袋式除尘器6个主要构件特点及5个常见问题及处理措施...

随着国家环保要求越来越高&#xff0c;对大气粉尘污染的严格管控&#xff0c;除尘设备在多领域得到大量应用&#xff0c;在防治粉尘污染、改善作业环境、实现烟气达标排放方面发挥着很大作用。本文分享脉冲袋式除尘器6个主要构件特点及5个常见问题及处理措施。1.脉冲袋式除尘器…