C++运算符重载(三)

       C++允许在自己的类中,或是在全局作用域中重定义运算符的含义。由于很多面向对象的语言没有提供这种能力,因此你可能会低估这种特性在C++中的作用。C++中运算符的概念十分广泛,甚至包含[](数组索引)、()(函数调用)、类型转换以及内存分配和释放例程。可以通过运算符重载来改变语言运算符对自定义类的行为。能让自己的类具有内建类型的类似行为,甚至可以编写看上去类似于数组、函数或指针的类。在博主的《C++运算符重载》系列博文中会对我们常用的运算符提供重载的实例,希望大家能有所收获。额,本篇博文就让我们一起来探讨一下重载运算符中的算术运算符重载吧。

       算术运算符包括双目运算符“+“(加法)、“-”(减法)、“*”(乘法)、“/”(除法)、“%”(求模)和单目运算符“+”(正号)、“-”(负号)、“++”(前置++和后置++)、“--”(前置—和后置--)。对于双目运算符我们一般把他们重载为全局函数,而单目运算符我们重载为类方法。咱们举个简单的栗子吧。

//Demo.h

#pragma once

 

//定义模板类

template <typenameT>

class Demo

{

public:

    Demo(constT& value = T());

    virtual~Demo(){}

 

    voidshow() const;

 

    template<typename T>/*不能省略*/

    friendT operator + (const T &lhs, const T &rhs);

    template<typename T>/*不能省略*/

    friendT operator - (const T &lhs, const T &rhs);

    template<typename T>/*不能省略*/

    friendT operator * (const T &lhs, const T &rhs);

    template<typename T>/*不能省略*/

    friendT operator / (const T &lhs, const T &rhs);

    template<typename T>/*不能省略*/

    friendT operator % (const T &lhs, const T &rhs);

   

    //负号算术运算符

    constDemo<T>operator - () const;

    //正号算术运算符

    constDemo<T>operator + () const;

    //前置++算术运算符

    Demo<T>&operator ++ ();

    //后置++算术运算符

    Demo<T>operator ++ (int);

    //前置--算术运算符

    Demo<T>&operator -- ();

    //后置--算术运算符

    Demo<T>operator -- (int);

 

private:

    T   m_value;

};

 

#include “Demo.inl”

 

//Demo.inl

template <typenameT>

Demo<T>::Demo(constT& value/* =T()*/)

    : m_value(value)

{

 

}

 

template <typenameT>

void Demo<T>::show() const

{

    cout<< m_value << endl;

}

 

template <typenameT>

const Demo<T> Demo<T>::operator - () const

{

    returnDemo<T>(-this->m_value);

}

 

template <typenameT>

const Demo<T> Demo<T>::operator + () const

{

    return*this;

}

 

template <typenameT>

Demo<T>&Demo<T>::operator++ ()

{

    ++(this->m_value);

 

    return*this;

}

 

template <typenameT>

Demo<T>Demo<T>::operator++ (int)

{

    Demo<T>demo(*this);

 

    ++(this->m_value);

 

    returndemo;

}

 

template <typenameT>

Demo<T>&Demo<T>::operator-- ()

{

    --(this->m_value);

 

    return*this;

}

 

template <typenameT>

Demo<T>Demo<T>::operator-- (int)

{

    Demo<T>demo(*this);

 

    --(this->m_value);

 

    returndemo;

}

 

template <typenameT>

T operator + (constT &lhs, constT &rhs)

{

    returnT(lhs.m_value+ rhs.m_value);

}

 

 

template <typenameT>

T operator - (constT &lhs, constT &rhs)

{

    returnT(lhs.m_value- rhs.m_value);

}

 

template <typenameT>

T operator * (constT &lhs, constT &rhs)

{

    returnT(lhs.m_value* rhs.m_value);

}

template <typenameT>

T operator / (constT &lhs, constT &rhs)

{

    returnT(lhs.m_value/ rhs.m_value);

}

 

template <typenameT>

T operator % (constT &lhs, constT &rhs)

{

    returnT(lhs.m_value% rhs.m_value);

}

 

//main.cpp

#include <iostream>

#include “Demo.h”

using namespacestd;

 

int main()

{

    Demo<int>myDemo1(3);

    Demo<int>myDemo2(4);

 

   

    cout<< "myDemo1 + myDemo2: ";

    (myDemo1 +myDemo2).show();

 

    cout<< "myDemo1 - myDemo2: ";

    (myDemo1 -myDemo2).show();

 

    cout<< "myDemo1 * myDemo2: ";

    (myDemo1 *myDemo2).show();

 

    cout<< "myDemo1 / myDemo2: ";

    (myDemo1 /myDemo2).show();

 

    cout<< "myDemo1 % myDemo2: ";

    (myDemo1 %myDemo2).show();

 

    cout<< "-myDemo1: ";

    (-myDemo1).show();

 

    cout<< "+myDemo1: ";

    (+myDemo1).show();

 

    cout<< "++myDemo1: ";

    (++myDemo1).show();

 

    cout<< "myDemo1++: ";

    (myDemo1++).show();

 

    cout<< "--myDemo1: ";

    (--myDemo1).show();

 

    cout<< "myDemo1--: ";

    (myDemo1--).show();

 

    return0;

}

 

程序运行结果:


       是不是感觉使用自定义类Demo时,就像在使用内建类型一样,这也是我们在《C++运算符重载(一)》中说的运算符重载的理由之一:让自定义类的行为和内建类型一样。相信你已经掌握了算术运算符重载函数的编写,是不是很neasy!

        细心的小伙伴可能已经注意到那个“++”(前置++和后置++)和“--”(前置—和后置--)算术运算符,它们做前置和后置的区别就在于有没有参数。其实作为后置运算符时,那个参数没有实际意义,只是做个占位用于区分前置运算符罢了。

        C++运算符重载中的算术运算符重载就讲到这里,相信大家对它的概念和用法都已经熟悉了吧。如果想了解更多关于C++运算符重载的知识,请关注博主的《C++运算符重载》系列博文,在那里我们将会通过程序实例去探讨C++运算符重载的魅力,相信你在那里会有不一样的收获。当然,如果你对C++很感兴趣的话,那么请关注博主的《漫谈继承技术》和《灵活而奇特的C++语言特性》系列博文,在那里你也许会发现C++更大的魅力,让你对这门博大精深的语言更加爱不释手。


内容概要:本文档详细介绍了基于MATLAB实现的无人机维路径规划项目,核心算法采用蒙特卡罗树搜索(MCTS)。项目旨在解决无人机在复杂维环境中自主路径规划的问题,通过MCTS的随机模拟与渐进式搜索机制,实现高效、智能化的路径规划。项目不仅考虑静态环境建模,还集成了障碍物检测与避障机制,确保无人机飞行的安全性和效率。文档涵盖了从环境准备、数据处理、算法设计与实现、模型训练与预测、性能评估到GUI界面设计的完整流程,并提供了详细的代码示例。此外,项目采用模块化设计,支持多无人机协同路径规划、动态环境实时路径重规划等未来改进方向。 适合人群:具备一定编程基础,特别是熟悉MATLAB和无人机技术的研发人员;从事无人机路径规划、智能导航系统开发的工程师;对MCTS算法感兴趣的算法研究人员。 使用场景及目标:①理解MCTS算法在维路径规划中的应用;②掌握基于MATLAB的无人机路径规划项目开发全流程;③学习如何通过MCTS算法优化无人机在复杂环境中的飞行路径,提高飞行安全性和效率;④为后续多无人机协同规划、动态环境实时调整等高级应用打下基础。 其他说明:项目不仅提供了详细的理论解释和技术实现,还特别关注了实际应用中的挑战和解决方案。例如,通过多阶段优化与迭代增强机制提升路径质量,结合环境建模与障碍物感知保障路径安全,利用GPU加速推理提升计算效率等。此外,项目还强调了代码模块化与调试便利性,便于后续功能扩展和性能优化。项目未来改进方向包括引入深度强化学习辅助路径规划、扩展至多无人机协同路径规划、增强动态环境实时路径重规划能力等,展示了广阔的应用前景和发展潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值