C++中的运算符重载
程序员文章站
2024-03-17 20:38:22
...
C++中的运算符重载
程序员可以重定义或重载大部分 C++ 内置的运算符。这样就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
运算符重载规则如下:
①、 C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。
②、 重载之后运算符的优先级和结合性都不会改变,但是运算对象的求值顺序无法应用到重载的运算符上。
③、 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。
不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。
下面以一个位置坐标position类作为一个例子介绍一些常见的运算符重载,其中position类包含三维坐标x,y,z。主要有输出操作符重载、算术运算符重载、关系运算符重载。
overloadtest.h
#pragma once
#include <iostream>
class Position
{
public:
Position() = default;//默认构造函数
Position(double x, double y,
double z) :x(x), y(y), z(z) {};
~Position() = default;
//输出操作符重载,由于是类外的函数,访问类内私有变量则应该被定义为友元函数
friend std::ostream& operator<< (std::ostream& out, Position& pos);
friend bool operator== (const Position& lpos, const Position& rpos);
//算术运算符重载,+=应该定义为类内的成员函数,+应该定义为类外的函数
Position& operator+= (const Position& rpos);
private:
double x;
double y;
double z;
};
Position operator+ (const Position& lpos, const Position& rpos);
bool operator!= (const Position& lpos, const Position& rpos);
overloadtest.cpp
#include "overloadtest.h"
//输出操作符重载,约定写在类外而不是成员函数
std::ostream& operator<< (std::ostream& out, Position& pos)
{
out << pos.x << " " << pos.y << " " << pos.z << " " << std::endl;
return out;
}
//算术运算符重载,+=应该定义为类内的成员函数
Position& Position::operator+= (const Position& rpos)
{
x += rpos.x;
y += rpos.y;
z += rpos.z;
return *this;
}
//算术运算符重载,+应该定义为类外函数
Position operator+ (const Position& lpos, const Position& rpos)
{
Position sum = lpos;
sum += rpos;
return sum;
}
//相等操作符重载,约定写在类外而不是成员函数
bool operator== (const Position& lpos, const Position& rpos)
{
return lpos.x == rpos.x&&lpos.y == rpos.y&&lpos.z == rpos.z;
}
bool operator!= (const Position& lpos, const Position& rpos)
{
return !(lpos == rpos);
}
main.cpp
#include <iostream>
#include "overloadtest.h"
using namespace std;
int main()
{
Position pos(10, 5.0, 6.0);
Position pos1(10, 5.0, 6.0);
Position pos2(1.5, 12.3, -5.8);
cout << "pos1: " << pos1 << endl;//输出操作符重载
cout << "pos2: " << pos2 << endl;//输出操作符重载
pos2 += pos1;//+=运算符重载
cout << "pos2: " << pos2 << endl;//输出操作符重载
Position pos3 = pos1 + pos1;//+运算符重载
cout << "pos3: " << pos3 << endl;//输出操作符重载
if (pos == pos1)
{
cout << "pos 等于 pos1" << endl;
}
if (pos != pos2)
{
cout << "pos 不等于 pos2" << endl;
}
system("pause");
return 0;
}
结果
上一篇: 最近实现的一个分离文章内容功能,挺有意思,分享一下
下一篇: C++的运算符重载
推荐阅读
-
C++的运算符重载
-
C++中的运算符重载
-
C++ 运算符重载 002:看上去好坑的运算符重载
-
c++ STL中的Binary search (二分查找)
-
程序设计实习MOOC / 程序设计与算法(三)第04周测验(2020春季) 002:看上去好坑的运算符重载
-
派生类中new方法和override重载方法的区别
-
Mongodb C++ driver中的逻辑操作“或” 博客分类: mongodb记录点滴 mongdblogic operationorand
-
C++将一个有序数组按顺序移动,在移动后的数组中查找一个数字
-
找出数组中第k大的数(时间复杂度分析、C++代码实现). TopK in array. ( leetcode - 215 )
-
【C++】基于快速排序的思想求解一堆数中第K大的值,时间复杂度为 O(n)