C ++中字符串类运算符重载示例

一、基本概念
(一) 函数重载的含义
所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是”一名多用”。

(二) 为什么要进行函数重载
一般情况下,编译器对现有操作符的操作数是有一定的限制,但是通常情况下用户使用class会自定义类型,而编译器是不认可这种类型的操作符运算的,所以可以将操作符进行重载达到可以根据自定义类型进行运算;

(三)函数重载的一般格式
返回值类型 operator op(参数)

(四)一般符号重载的实现步骤:
一般情况下函数重载使用成员函数实现

  • 1)要承认操作符重载是一个函数,写出函数名称operator op ()
  • 2)根据所要重载的操作符的操作数,写出函数参数
  • 3)根据函数的目的,完善函数返回值(看函数是返回引用 还是指针 元素)
  • 4)实现具体的函数内容

二、具体的程序示例
程序分为三部分:
声明:MyString.h
具体实现:MyString.cpp
应用:example.cpp
运行平台为:windows 10 & VS2017,所有程序运行结果均正确

1.MyString.h

#pragma once
#include "iostream"
using namespace std;

class MyString
{
public:
//这是构造函数和析构函数
	MyString();
	MyString(const char *p);
	MyString(const MyString &s);
	~MyString();
private:
	int m_len;
	char* m_p;

public:
//实现  =  操作符的重载
	MyString& operator=(const char *p);
	MyString& operator= (const MyString &s);
//实现 []  操作符的重载
	char& operator[](int index);
//实现  <<  操作符的重载
	friend ostream & operator<<(ostream &out, 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 MyString &s);
};

2.MyString.cpp

#include "MyString.h"
#include"math.h"
#include "iostream"
#pragma warning(disable:4996)

//构造函数:
	//将对象初始化为空字符串
MyString::MyString() 
{
	m_len = 0; 
	m_p = new char[m_len + 1]; 
	//开辟一个存放字符数组的空间,大小为(m_len + 1) *1 ,并且返回首地址赋值给指针变量m_p 
	strcpy(m_p, " ");
}

  //将对象初始化为一个字符串
MyString::MyString(const char *p)
{
	if (p == NULL)
	{
		m_len = 0;
		m_p = new char[m_len + 1];
		strcpy(m_p, "");
	}else
	{
		m_len = strlen(p);
		m_p = new char[m_len + 1];
		strcpy(m_p, p);
	}
}

//拷贝构造函数
	//实现MyString s3 = s2;
 MyString::MyString(const MyString &s)
{
	m_len = s.m_len;   
	m_p = new char[m_len + 1];  //分配空间
	strcpy(m_p, s.m_p);
}


//析构函数的实现
 MyString::~MyString()
 {
	 if (m_p != NULL)
	 {
		 delete[] m_p;
		 m_p = NULL;
		 m_len = 0;
	 }
 }


//下面进行的是操作符重载
	//等号 = 操作符重载
		//用于实现s4 = "s2222"
 MyString&MyString:: operator=(const char *p)
	{
		//因为s4已经分配内存,应该先将旧的内存空间删掉然后再分配新的
		
		//1.释放旧内存
		if (m_p != NULL)
		{
			delete[] m_p;
			m_p = NULL;
			m_len = 0;
		}else
		{
			//分配新的内存
			if (p == NULL)
			{
				m_len = 0;
				m_p = new char[m_len + 1];
				strcpy(m_p, "");
			}
			else
			{
				m_len = strlen(p);
				m_p = new char[m_len + 1];
				strcpy(m_p, p);
			}
			return *this;
		}
	}


		//用于实现s4 = s2
 MyString&MyString:: operator= (const MyString &s)
	{
		if (m_p != NULL)
		{
			delete[] m_p;
			m_p = NULL;
			m_len = 0;
		}else
		{
			//根据s(对应于s2)分配新的内存
			m_len = s.m_len;
			m_p = new char[m_len + 1];
			strcpy(m_p, s.m_p);
			return *this;
		}
	}


//实现[] 操作符重载
 char&MyString::operator[](int index)
 {
	 return m_p[index];
 }


 //注意这个是全局函数,所以函数名前面不能加上MyString::  
 ostream& operator<<(ostream &out, MyString &s)
 {
	 cout << s.m_p;
	 return out;
 }



 //下面是实现==和!= 的重载,其中分为类和字符串的比较与类和类的比较
 bool MyString::operator==(const char *p)
 {
	 if (p == NULL)
	 {
		 if (m_len == 0)
		 {
			 return true;
		 }
		 else
		 {
			 return false;
		 }
	 }
	 else
	 {
		 if (m_len == strlen(p))
		 {
			 return !strcmp(m_p, p);
		 } 
		 else
		 {
			 return false;
		 }
	 }
	 return true;
 }

 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);
 }






 //实现  <  的重载

 int MyString::operator<(const char *p)
 {
	 return strcmp(this->m_p, p);
 }
 int MyString::operator<(const MyString &s)
 {
	 return strcmp(this->m_p, s.m_p);
 }

3.example.cpp

// 实现一个字符串类
//C语言中 没有字符串这种类型,是通过数组来模拟字符串

//C++中 我们来设计一个字符串类 以零结尾的字符串

//若len为0,表示空串

#include "iostream"
#include "MyString.h"
using namespace std;
#pragma  warning (disable: 4996)


int main()
{
	MyString s1;
	MyString s2("s2");
	MyString s2_2 = NULL;
	MyString s3 = s2;


//下面进行操作符重载
	//=操作符
	//两种调用方式;
	MyString s4 = "adfdfdn";
	
	s4 = "s2222"; 

	//调用方式二;
	s4 = s2;

//实现[]重载
  //当[]当右值的时候
	s4[1] = 'a';
	cout << "s4[1] = " << s4[1] << endl;

//实现<<操作符的重载
	cout << s4 << endl;   //相当于实现字符串的整体输出

//实现== 和!= 的重载
	MyString s5 = "ahhhh";
	
	if (s5 == "shhsk")
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}

	if (s5 != "sjfddsj")
	{
		cout << "false" << endl;
	}
	else
	{
		cout << "true" << endl;
	}
	
	//两个类之间做判断
	
	if (s5 == s2)
	{
		cout << "true" << endl;
	}
	else
	{
		cout << "false" << endl;
	}

	if (s5 != s2)
	{
		cout << "false" << endl;
	}
	else
	{
		cout << "true" << endl;
	}



//实现大于小于号的符号重载

	MyString s6 = "skdjfkld";
	if (s6 < "kdjfkdj")
	{
		cout << "s6 smaller than  skdjfkld" << endl;
	} 
	else
	{
		cout << "s6  bigger than  skdjfkld" << endl;
	}


	if (s6 < s5)
	{
		cout << "s6 smaller than s5" << endl;
	}
	else
	{
		cout << "s6 bigger than s5" << endl;
	}


	//使用类中的private:的指针

	MyString s7 = "jdkfjdklfjdl";
	strcpy(s7.c_str(), "lskjdfkljdklf");
	cout << s7 << endl;
}


  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计的实现,以及它们在MATLAB环境的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值