返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)
  • 787
分享到

C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)

2024-04-02 19:04:59 787人浏览 独家记忆
摘要

目录1. c++运算符重载介绍1.1 单目运算符与双目运算符1.2 友元运算符2. 实例讲解2.1 头文件定义2.2 实现运算符重载总结1. C++运算符重载介绍 C ++ 中预定义

1. C++运算符重载介绍

C ++ 中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C ++ 中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C ++ 的可扩展性,也是C ++ 最吸引人的特性之一。

运算符重载时要遵循以下规则:

( 1 ) 除了类属关系运算符 " . " 、成员指针运算符 " .* " 、作用域运算符 " :: " 、sizeof运算符和三目运算符 " ?: " 以外,C ++ 中的所有运算符都可以重载。

( 2 ) 重载运算符限制在C ++ 语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。

( 3 ) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

( 4 ) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

( 5 ) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。

( 6 ) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

1.1 单目运算符与双目运算符

( 1 ) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。

比如说你重载+号,如果写在类外面,那么是需要两个参数的,而写在类里面,只能写一个参数,因为当这个函数被调用的时候,会自动的传一个this指针进去,就是对象本身,所以只需要一个参数

( 2 ) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。

( 3 ) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

比如前置++,和后置++,带一个整形形参只是为了区分

1.2 友元运算符

有些运算符是一定得声明为友元的,比如<<,>>运算符

因为=,+这些运算符,是c++最基本的运算符,而>>,<<运算符是标准头文件里面的一个类里面写的,你不能把这个函数声明为你这个自定义类的函数,因为这是别人类里面的函数,因此你只能把它声明为友元函数,声明为友元函数之后,那么这个函数它就可以访问你这个自定义类里面的私有成员变量

2. 实例讲解

光看这些概念,想必没有接触过的同学头都大了,接下来我通过一个向量类的例子,来讲解一下各个运算符重载怎么用

2.1 头文件定义

这次我们来实例一个向量类,什么是向量类呢,就是数学里面的向量,一个括号,里面两个数字,看一下头文件你就明白啦


class Vec2D {
private:
 double x_;
 double y_;

public:

 static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
 Vec2D(double x, double y) :x_(x), y_(y) {}
 Vec2D() { x_ = 0.0; y_ = 0.0; }
 
 std::string toString();
 
 friend Vec2D operator+(const Vec2D& v1, const Vec2D& v2);
 friend Vec2D operator-(const Vec2D& v1, const Vec2D& v2);
 friend double operator*(const Vec2D& v1, const Vec2D& v2);
 friend Vec2D operator+(const Vec2D& v1, double num);
 friend Vec2D operator*(const double num, const Vec2D& v2);
 friend Vec2D operator*(const Vec2D& v2, const double num);
 friend istream& operator>>(istream& stream, Vec2D& v1);
 friend std::ostream& operator<<(std::ostream& stream, const Vec2D& v1);

 Vec2D negative();

 Vec2D operator-();

 Vec2D operator++();
 Vec2D operator++(int dummy);

 Vec2D operator--();

 Vec2D operator+=(const Vec2D& v);
 Vec2D operator-=(const Vec2D& v);

 double& operator[](const int& index);

 double magnitude();
 double direction();
 int compareTo(Vec2D& v2);

 operator double();

 double getX()const { return x_; }
 double getY() const { return y_; }
 void setX(double x) { x_ = x; }
 void setY(double y) { y_ = y; }
};

可以看到,其实私有成员就是 x_和y_,然后我重载了非常多的函数,下面我们来看一下具体的实现

2.2 实现运算符重载

toString函数

这个函数我就不多说啦,比较简单


std::string Vec2D::toString()
{
 std::string res = "(" + std::to_string(getX()) + ", " + std::to_string(getY()) + ")";
 return res;
}

negative函数

这个函数是用来将向量变成负方向


Vec2D Vec2D::negative()
{
 return Vec2D(-1 * x_, -1 * y_);
}

operator-函数

第一个重载函数出现了,是重载的符号,更加方便的实现了改变向量为负方向的操作

这样我们可以通过 -a,-b的形式来调用


Vec2D Vec2D::operator-()
{
 return Vec2D(-1 * x_, -1 * y_);
}

operator++函数

这个函数是前置++运算符,返回*this就是返回当前对象


Vec2D Vec2D::operator++()
{
 x_++;
 y_++;
 return *this;
}

operator++函数

这个函数是后置++运算符,所以后面加了一个类型的参数,这个参数唯一的意思是与前置++作区分

我们首先创建了一个临时变量,然后将本身的x,y加1,返回的却是临时变量,这样就实现了后置++的操作


static string AuthorBlog = "Https://www.cnblogs.com/wanghongyang";
Vec2D Vec2D::operator++(int dummy)
{
 Vec2D ret(x_, y_);
 x_++;
 y_++;
 return ret;
}

operator--函数

减减同理,就是将x,y都减1


static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
Vec2D Vec2D::operator--()
{
 x_ -= 1;
 y_ -= 1;
 return *this;
}

operator+= ,-=函数

这两个函数比较相似,我就放到一起讲啦,这里是将调用这个函数本身的对象,与参数里面的v相加或者相减


static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
Vec2D Vec2D::operator+=(const Vec2D& v)
{
 x_ += v.x_;
 y_ += v.y_;
 return *this;
}

Vec2D Vec2D::operator-=(const Vec2D& v)
{
 x_ -= v.x_;
 y_ -= v.y_;
 return *this;
}

operator[ ]函数

这里重载了[ ],有一个参数,index,用来选择到底是返回x还是y


static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
double& Vec2D::operator[](const int& index)
{
 if (index == 0) {
  return x_;
 }
 else if (index == 1) {
  return y_;
 }
 else {
  printf("subscript error\n");
  exit(0);
 }
}

operator+(类外)函数

因为是在类外重载,所以有两个参数,同时要注意将这个函数声明为友元函数,因为这样才可以访问私有成员变量


static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
//类外重载,运算符重载函数作为类的友元函数
Vec2D operator+(const Vec2D& v1, const Vec2D& v2) {
 Vec2D ret;

 ret.setX(v1.getX() + v2.getX());
 ret.setY(v1.getY() + v2.getY());

 return ret;
}

Vec2D operator+(const Vec2D& v1, double num) {
 Vec2D ret;

 ret.setX(v1.getX() + num);
 ret.setY(v1.getY() + num);

 return ret;
}

operator*函数

这里重载了*,用来实现向量之间的相乘


static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
Vec2D operator*(const double num, const Vec2D& v2) {
 Vec2D ret;

 ret.setX(num * v2.getX());
 ret.setY(num * v2.getY());

 return ret;
}

重载>> <<

这里给大家避个坑,一定要引入iOStream头文件,而不是用using

这两个函数就是用来实现cout和cin

可以看到,实现cin 是通过 istream对象来实现的

实现cout 是通过ostream来实现的

记得在最后返回istream或者ostream对象


istream& operator>>(istream& stream, Vec2D& v1)
{
 double x, y;
 stream >> x >> y;
 v1.setX(x);
 v1.setY(y);
 // 也可以直接
 // stream >> x_ >> y_;
 return stream;
}

ostream& operator<<(ostream& stream, const Vec2D& v1)
{
 std::string res = "(" + std::to_string(v1.getX()) + ", " + std::to_string(v1.getY()) + ")";
 stream << res;

 return stream;
}

总结

到此这篇关于C++11运算符重载和向量类重载的文章就介绍到这了,更多相关C++11运算符重载向量类重载内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)

本文链接: https://lsjlt.com/news/130552.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)
    目录1. C++运算符重载介绍1.1 单目运算符与双目运算符1.2 友元运算符2. 实例讲解2.1 头文件定义2.2 实现运算符重载总结1. C++运算符重载介绍 C ++ 中预定义...
    99+
    2024-04-02
  • C++重载的奥义之运算符重载详解
    目录0、引言1、运算符重载定义2、作为成员函数进行重载3、作为全局函数进行重载4、运算符重载的一些规则0、引言 重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一...
    99+
    2023-05-16
    C++ 运算符重载 C++ 运算符 C++ 重载
  • C++运算符重载图文详解
    目录1. 运算符重载1.1 运算符重载为普通函数1.2 运算符重载为成员函数2. 赋值运算符=的重载2.1浅复制与深复制2.2返回值的讨论3. 动态可变长度数组总结1. 运算符重载 ...
    99+
    2024-04-02
  • C++中的运算符重载详解
    目录1、引例2、类中自动建立的函数3、重载赋值运算符解析总结1、引例 class Complex { private: double Real,Image; public: ...
    99+
    2024-04-02
  • C++类与对象之运算符重载详解
    目录运算符重载加号运算符重载左移运算符重载递增运算符重载递减运算符重载赋值运算符重载关系运算符重载函数调用运算符重载总结运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其...
    99+
    2024-04-02
  • C#运算符重载的实例介绍
    本篇内容介绍了“C#运算符重载的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#运算符重载实例是掌握C#运算符重载的有效方法,那么...
    99+
    2023-06-18
  • C++重载运算符是实例分析
    本篇内容介绍了“C++重载运算符是实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!运算符实际上是一个函数,所以运算符的重载实际上是函数...
    99+
    2023-06-29
  • 关于C++的重载运算符和重载函数
    目录C++重载运算符和重载函数C++ 中的函数重载C++ 中的运算符重载可重载运算符/不可重载运算符C++重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定...
    99+
    2023-05-19
    C++重载运算符 C++重载函数
  • C++运算符重载的详细讲解
    加号运算符重载 对于内置数据类型,编译器知道如何运算 但是对于自己封装的类,编译器无法进行运算 这时可以通过自己定义运算符重载进行运算 operator+ 通过成员函数重载+号 ...
    99+
    2024-04-02
  • C++双目运算符+=的重载详解
    目录1、+=重载2、friend重载+=3、运算符3.1 单目运算符3.2 双目运算符3.3 三目运算符4、重载++和重载- -总结1、+=重载 class Complex { ...
    99+
    2024-04-02
  • C语言运算符的重载详解
    目录运算符重载的规则 1. 运算符重载为成员函数2. 运算符重载为非成员函数        ...
    99+
    2024-04-02
  • C++超详细讲解运算符重载
    目录概念赋值运算符重载const成员取地址及const取地址操作符重载概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名...
    99+
    2024-04-02
  • C++中运算符重载问题详解
    C++中运算符重载问题详解运算符重载是C++中的一个重要特性,它允许我们为自定义的类类型重载运算符,使得这些类对象之间的运算能够像内置类型一样进行。在本文中,我们将详细讨论C++中运算符重载的概念、使用方法以及常见的问题。一、什么是运算符重...
    99+
    2023-10-22
    问题详解 C++运算符重载
  • Python运算符重载详解及实例代码
    Python运算符重载 Python语言提供了运算符重载功能,增强了语言的灵活性,这一点与C++有点类似又有些不同。鉴于它的特殊性,今天就来讨论一下Python运算符重载。 Pyth...
    99+
    2022-06-04
    详解 运算符 实例
  • C++运算符重载详情介绍
    文章转自公众号:Coder梁(ID:Coder_LT) C++当中除了函数可以重载之外,其实运算符也是可以重载的。我们之前已经接触过一些,可能大家没有意识到。 举个例子,乘号*,运用...
    99+
    2024-04-02
  • Python的运算符重载详解
    目录一、前言二、重载作用三、自定义列表一、前言 运算符重载:为运算符定义方法 所谓重载,就是赋予新的含义同一个运算符可以有不同的功能 二、重载作用 让自定义的实例像内建对象一样进行运...
    99+
    2024-04-02
  • C++中的运算符重载问题详解
    C++中的运算符重载问题详解运算符重载是C++中一个强大而有用的特性,通过重载运算符,可以使得某个类的对象可以像基本类型数据一样使用各种运算符,方便地进行各种操作。本文将详细解释运算符重载的概念,并提供具体的代码示例。在C++中,运算符重载...
    99+
    2023-10-22
    运算符重载 (Operator Overloading) C++中的运算符 (Operators in C++) 重载运
  • C++日期类运算符重载方式
    目录构造函数拷贝构造赋值运算符重载“+” 日期+天数“-” 日期-天数“+=” 日期+=天数“-=...
    99+
    2023-02-06
    C++日期类 运算符重载 C++运算符
  • 详解C++中递增运算符重载的实现
    目录递增运算符递增运算符重载的实现左移运算符重载前置递增运算符重载后置递增运算符重载递增运算符 形如"a++"、"++a"。如果a初始值为1,...
    99+
    2024-04-02
  • Swift 重构重载运算符示例解析
    目录一、思路来源二、基础类型 String 为例重载乘法运算符源码实现:三、对象类型 UIEdgeInsets 为例重载加法运算符将源码实现:四、总结一、思路来源 研究自定义运算符...
    99+
    2023-03-13
    Swift 重构重载运算符 Swift  重构重载
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作