前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【C++】运算符重载 ④ ( 一元运算符重载 | 使用 全局函数 实现 前置 ++ 自增运算符重载 | 使用 全局函数 实现 前置 - - 自减运算符重载 )

【C++】运算符重载 ④ ( 一元运算符重载 | 使用 全局函数 实现 前置 ++ 自增运算符重载 | 使用 全局函数 实现 前置 - - 自减运算符重载 )

作者头像
韩曙亮
发布于 2023-10-15 09:24:56
发布于 2023-10-15 09:24:56
24700
代码可运行
举报
运行总次数:0
代码可运行

一、一元运算符重载

1、一元运算符列举

一元运算符 : 又称为 单目运算符

  • 取反运算符 : -
  • 解引用运算符 : *
  • 取地址运算符 : &
  • 自增运算符 : ++ , 该运算符分为 前置 和 后置 两种类型 ;
  • 自减运算符 : – , 该运算符分为 前置 和 后置 两种类型 ;

2、为下面的类实现运算符重载操作

本博客中 , 为下面的 Student 类实现 一元运算符 重载操作 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Student
{
public:
	// 带参构造函数 , 为参数设置默认值
	Student(int age = 1, int height = 1)
	{
		this->age = age;
		this->height = height;
	};

public:
	// 打印类数据
	void print()
	{
		cout << "age = " << age << " , height = " << height << endl;
	};

public:
	// 使用 成员函数 实现 运算符重载 
	// 重载 - 运算符
	// 实现两个 Student 对象相加
	Student operator-(Student& s)
	{
		Student student(this->age - s.age, this->height - s.height);
		return student;
	};

private:
	int age;		// 年龄
	int height;		// 身高
};

3、使用 全局函数 实现 前置 ++ 自增运算符重载

使用 全局函数 实现 前置 ++ 自增运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 , 函数名是 operate++ ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operate++
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 成员函数 : 参数是 1个对象的常量引用 , 如 : operate+(const Student& s1)
    • 全局函数 : 参数是 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operator++(Student& s)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 , 如 : 返回值是元素 Student operate+(Student& s1, Student& s2) ; 此处 , 由于 参数中的 Student& s 中的属性发生了变化 , 返回时仍需要返回 Student& s 参数本身 , 因此返回值是 Student& 引用类型 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student& operator++(Student& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用 全局函数 实现 前置 ++ 自增运算符重载
// 重载 前置 ++ 运算符
// 实现 1 个 Student 对象 自增运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator++(Student& s)
{
	s.age++;
	s.height++;
	return s;
};

为了使全局函数中能访问 Student 类的私有成员 , 需要将该全局函数声明为 友元函数 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 使用 全局函数 实现 前置 ++ 自增运算符重载
	friend Student& operator++(Student& s);

4、使用 全局函数 实现 前置 - - 自减运算符重载

使用 全局函数 实现 前置 - - 自减运算符重载 :

  • 首先 , 写出函数名 , 函数名规则为 " operate " 后面跟上要重载的运算符 , 函数名是 operate-- ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operate--
  • 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ;
    • 成员函数 : 参数是1个对象的常量引用 , 如 : operate+(const Student& s1)
    • 全局函数 : 参数是 2 个对象的引用 , 如 : operate+(Student& s1, Student& s2)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
operator--(Student& s)
  • 再后 , 根据业务完善返回值 , 返回值可以是 引用 / 指针 / 元素 , 如 : 返回值是元素 Student operate+(Student& s1, Student& s2) ; 此处 , 由于 参数中的 Student& s 中的属性发生了变化 , 返回时仍需要返回 Student& s 参数本身 , 因此返回值是 Student& 引用类型 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student& operator--(Student& s)
  • 最后 , 实现函数体 , 编写具体的运算符操作业务逻辑 ;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 使用 全局函数 实现 前置 -- 自减运算符重载
// 重载 前置 -- 运算符
// 实现 1 个 Student 对象 自减运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator--(Student& s)
{
	s.age--;
	s.height--;
	return s;
};

为了使全局函数中能访问 Student 类的私有成员 , 需要将该全局函数声明为 友元函数 ;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	// 使用 全局函数 实现 前置 -- 自增运算符重载
	friend Student& operator--(Student& s);

二、完整代码示例


代码示例 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数 , 为参数设置默认值
	Student(int age = 1, int height = 1)
	{
		this->age = age;
		this->height = height;
	};

public:
	// 打印类数据
	void print()
	{
		cout << "age = " << age << " , height = " << height << endl;
	};

public:
	// 使用 成员函数 实现 运算符重载 
	// 重载 - 运算符
	// 实现两个 Student 对象相加
	Student operator-(Student& s)
	{
		Student student(this->age - s.age, this->height - s.height);
		return student;
	};

private:
	// 友元函数 实现 全局函数 运算符重载
	// 使用 全局函数 实现 + 运算符重载 
	friend Student operator+(Student& s1, Student& s2);

	// 使用 全局函数 实现 前置 ++ 自增运算符重载
	friend Student& operator++(Student& s);

	// 使用 全局函数 实现 前置 -- 自增运算符重载
	friend Student& operator--(Student& s);

private:
	int age;		// 年龄
	int height;		// 身高
};

// 使用 全局函数 实现 运算符重载 
// 重载 + 运算符
// 实现两个 Student 对象相加
Student operator+(Student& s1, Student& s2)
{
	Student student(s1.age + s2.age, s1.height + s2.height);
	return student;
};

// 使用 全局函数 实现 前置 ++ 自增运算符重载
// 重载 前置 ++ 运算符
// 实现 1 个 Student 对象 自增运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator++(Student& s)
{
	s.age++;
	s.height++;
	return s;
};

// 使用 全局函数 实现 前置 -- 自减运算符重载
// 重载 前置 -- 运算符
// 实现 1 个 Student 对象 自减运算
// 由于 参数中的 Student& s 中的属性发生了变化 
// 返回时仍需要返回 Student& s 参数本身
Student& operator--(Student& s)
{
	s.age--;
	s.height--;
	return s;
};

int main() {
	// 自定义类型相加
	Student s1(10, 120), s2(18, 170);
	Student s3, s4, s5;

	++s1;
	s1.print();

	--s1;
	s1.print();

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
};

执行结果 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
age = 11 , height = 121
age = 10 , height = 120
请按任意键继续. . .
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++/学习】运算符重载&&const成员&&取地址
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键字operator 后面接需要重载的运算符符号。 函数原型:返回值类型 operator操作符(参数列表)
IsLand1314
2024/10/15
1160
【C++/学习】运算符重载&&const成员&&取地址
【C++】运算符重载 ⑤ ( 一元运算符重载 | 使用 成员函数 实现 前置 ++ 自增运算符重载 | 使用 成员函数 实现 前置 - - 自减运算符重载 )
韩曙亮
2023/10/15
2260
【C++】运算符重载 ⑤ ( 一元运算符重载 | 使用 成员函数 实现 前置 ++ 自增运算符重载 | 使用 成员函数 实现 前置 - - 自减运算符重载 )
【C++】运算符重载 ⑦ ( 一元运算符重载 | 后置运算符重载 | 使用 全局函数 实现 后置 ++ 自增运算符重载 | 使用 成员函数 实现 后置 -- 自减运算符重载 )
韩曙亮
2023/10/15
2430
【C++】运算符重载 ⑦ ( 一元运算符重载 | 后置运算符重载 | 使用 全局函数 实现 后置 ++ 自增运算符重载 | 使用 成员函数 实现 后置 -- 自减运算符重载 )
【C++】运算符重载 ⑥ ( 一元运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 )
讲解了 前置运算符 的 重载 , 前置运算符就是 ++Object 或 --Object , 一元运算符 在 对象的 前面 ;
韩曙亮
2023/10/15
1780
【C++】运算符重载 ⑥ ( 一元运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 )
【Example】C++ 运算符重载
首先,阅读之前要先搞清楚什么是运算符、函数重载。函数重载就是在一个范围内为一个函数声明多个实现方式,函数名必须一致。
芯片烤电池
2022/04/27
7930
C++ 自增、自减运算符的重载和性能分析
a 先自增 +1 后, a 的值就为 1 ,然后再参与 a=5 的运算,所以最后 a的值是 5。
小林coding
2020/04/01
1.1K0
C++ 自增、自减运算符的重载和性能分析
【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
逻辑与 && 和 逻辑或 || 运算符 是 可以重载的 , 这两个操作符是 特殊操作符 ;
韩曙亮
2023/10/15
2150
【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
【C++】运算符重载 ③ ( 二元运算符重载 | 运算符重载步骤 | 全局函数 实现 运算符重载 | 成员函数 实现 运算符重载 | 友元函数 实现 运算符重载 )
下面以 Student 类为例 , 编写 成员函数 / 全局函数 实现 运算符重载 代码 ;
韩曙亮
2023/10/15
2650
【C++】运算符重载 ③ ( 二元运算符重载 | 运算符重载步骤 | 全局函数 实现 运算符重载 | 成员函数 实现 运算符重载 | 友元函数 实现 运算符重载 )
C++(运算符重载+赋值拷贝函数+日期类的书写)
由于赋值操作我们改变的是调用这个函数的对象,所以我们在参数中可以加上cosnt修饰,传值和传引用,我们选择传引用,最后返回也返回引用,这样可以避免调用拷贝构造函数
用户11305458
2024/10/09
1060
C++(运算符重载+赋值拷贝函数+日期类的书写)
【C++修行之道】类和对象(四)运算符重载
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为:关键字operator后面接需要重载的运算符符号。 函数原型:返回值类型 operator操作符(参数列表)。
走在努力路上的自己
2024/06/05
1180
【C++修行之道】类和对象(四)运算符重载
C++运算符重载(三)之递增运算符重载
先++,后输出是指先运行成员函数前置递增运算符重载,再运行函数左移运算符重载。所以先++完成后再传入左移运算符重载函数中,要么是引用传递,要么是拷贝传递,上图使用的是拷贝传递,都可。
CtrlX
2022/09/21
7430
【C++】类和对象之赋值运算符重载
在前面的博客中提到了拷贝构造: 【C++】类和对象之拷贝构造函数篇,和 运算符重载【C++】类和对象之常引用与运算符重载,接下来继续来看赋值运算符重载中的赋值运算符重载。
zxctscl
2024/02/29
1580
【C++】类和对象之赋值运算符重载
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
Srlua
2024/05/26
1230
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
鲜于言悠
2024/04/17
1670
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
【c++】类和对象(五)赋值运算符重载
但是这里是全局的定义的operator==,这里会发现运算符重载成全局的就需要成员变量是公有的,即我的成员不能是private私有的,那么封装性如何保证?
用户11029103
2024/04/02
2290
【c++】类和对象(五)赋值运算符重载
【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
左移 << 操作符 cout << s << endl , 是将 s 对象输出到 cout 标准输出流中 ;
韩曙亮
2023/10/15
5980
[C++] 类和对象:运算符重载
在C++中,运算符重载是一种强大的特性,它允许我们重新定义已有的运算符,以便用于用户自定义的数据类型。通过运算符重载,我们可以使得我们自定义的类对象像内置类型一样进行运算,这为编写清晰、简洁且易于理解的代码提供了便利。
DevKevin
2024/05/12
1550
[C++] 类和对象:运算符重载
【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )
这是因为没有对 自定义类 的 " + " 运算符 , 进行 " 运算符重载 " , 直接使用加法操作 , 会报错 ;
韩曙亮
2023/10/15
2230
【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )
(转载非原创)C++运算符重载介绍
C ++ 中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C ++ 中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C ++ 的可扩展性,也是C ++ 最吸引人的特性之一。
xlj
2021/07/17
8580
C++:12---运算符重载
C++98,C++0x,C++11对“哪些运算符重载能够重载”有一致的规定。详细例如以下:
用户3479834
2021/02/03
6060
C++:12---运算符重载
推荐阅读
【C++/学习】运算符重载&&const成员&&取地址
1160
【C++】运算符重载 ⑤ ( 一元运算符重载 | 使用 成员函数 实现 前置 ++ 自增运算符重载 | 使用 成员函数 实现 前置 - - 自减运算符重载 )
2260
【C++】运算符重载 ⑦ ( 一元运算符重载 | 后置运算符重载 | 使用 全局函数 实现 后置 ++ 自增运算符重载 | 使用 成员函数 实现 后置 -- 自减运算符重载 )
2430
【C++】运算符重载 ⑥ ( 一元运算符重载 | 后置运算符重载 | 前置运算符重载 与 后置运算符重载 的区别 | 后置运算符重载添加 int 占位参数 )
1780
【Example】C++ 运算符重载
7930
C++ 自增、自减运算符的重载和性能分析
1.1K0
【C++】运算符重载 ⑭ ( 逻辑与 && 运算符重载 | 逻辑或 || 运算符重载 | 完整代码示例 )
2150
【C++】运算符重载 ③ ( 二元运算符重载 | 运算符重载步骤 | 全局函数 实现 运算符重载 | 成员函数 实现 运算符重载 | 友元函数 实现 运算符重载 )
2650
C++(运算符重载+赋值拷贝函数+日期类的书写)
1060
【C++修行之道】类和对象(四)运算符重载
1180
C++运算符重载(三)之递增运算符重载
7430
【C++】类和对象之赋值运算符重载
1580
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
1230
C++从入门到精通——类的6个默认成员函数之赋值运算符重载
1670
【c++】类和对象(五)赋值运算符重载
2290
【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )
5980
[C++] 类和对象:运算符重载
1550
【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )
2230
(转载非原创)C++运算符重载介绍
8580
C++:12---运算符重载
6060
相关推荐
【C++/学习】运算符重载&&const成员&&取地址
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验