【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )
  K1I6GvxBEuyy 2023年11月13日 46 0



文章目录

  • 一、运算符重载简介
  • 1、运算符重载引入
  • 2、运算符重载简介
  • 二、运算符重载推衍
  • 1、普通类型数据相加
  • 2、对象类型数据相加
  • 3、对象类型数据相加 - 普通函数实现
  • 4、对象类型数据相加 - 函数名修改为 operator+
  • 使用 operator+ 调用运算符重载函数
  • 使用 + 运算符 调用运算符重载函数
  • 三、完整代码示例







一、运算符重载简介




1、运算符重载引入



【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_运算符 个 int 类型的 基础类型 变量 , 相加 , 就是两个数值相加 ;

int x = 10, y = 20;
int z = x + y;

如果是 【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_运算符

  • 如果没有进行运算符重载 , 【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_c++_03
// 自定义类型相加
	Student s1(10, 120), s2(18, 170);
	Student s3;
	s3 = s1 + s2;

报错信息如下 :

error C2676: 二进制“+”:“Student”不定义该运算符或到预定义运算符可接收的类型的转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。

【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_运算符重载_04

这是因为没有对 自定义类 的 " + " 运算符 , 进行 " 运算符重载 " , 直接使用加法操作 , 会报错 ;



这里就需要为 类 设置 " 运算符重载 " , 才能进行类的相加操作 , 具体相加的结果 , 需要通过 重载的运算符函数的操作决定 ;



2、运算符重载简介



运算符重载 , 可以使 用户自定义数据 , 以 更简洁的方式 运作 ;

运算符重载 是 C++ 语言中的 一种特殊的语言特性 , 运算符重载 机制允许 开发者 为自定义类型 重新定义 运算符 的行为 ;

通过运算符重载 , 可以使 自定义类型 以 更自然 和 直观 的方式与 内置类型 进行交互 ;

要重载一个 运算符 , 需要在 类中 声明一个 成员函数 或 非成员函数 , 并使用 operator 关键字 修饰 要重载的 运算符函数 , 这个函数的 参数 和 返回类型 决定了运算符的行为 ;






二、运算符重载推衍




1、普通类型数据相加



基础数据类型相加 , 如 : int 类型 ;

可以直接计算 , 获得结果 ;

// 基础数据类型相加
	int x = 10, y = 20;
	int z = x + y;
	// 打印计算结果
	cout << "z = " << z << endl;



2、对象类型数据相加



以下面的 Student 对象为例 ;

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

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

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

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

【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_c++_05

Student s1(10, 120), s2(18, 170);
	Student s3;
	s3 = s1 + s2;

强行进行加法计算 , 会报如下错误 , 只能在一个函数中实现对象相加的计算逻辑 ;

报错信息如下 :

error C2676: 二进制“+”:“Student”不定义该运算符或到预定义运算符可接收的类型的转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。



3、对象类型数据相加 - 普通函数实现



定义 addStudent 全局函数 , 接收 【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_c++_05

在上述全局函数中 , 实现 【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_c++_05

将其 age 和 height 成员分别相加即可 ;

// 使用普通方法实现两个 Student 对象相加
Student addStudent(Student& s1, Student& s2)
{
	Student s(s1.age + s2.age, s1.height + s2.height);
	return s;
}

调用时 , 将 【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_c++_05

// 自定义类型相加
	Student s1(10, 120), s2(18, 170);
	Student s3 = addStudent(s1, s2);



4、对象类型数据相加 - 函数名修改为 operator+



将上述 addStudent 函数的 函数名修改为 operator+ , 就变成了 运算符重载 ;

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

使用 operator+ 调用运算符重载函数

operator+ 函数 , 可以直接使用 函数的方式调用 ,

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

	// 全局函数实现对象相加
	s3 = addStudent(s1, s2);

	// 运算符重载实现对象相加
	s4 = operator+(s1, s2);

使用 + 运算符 调用运算符重载函数

直接使用 + 运算符调用 运算符重载函数 ;

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

	// 全局函数实现对象相加
	s3 = addStudent(s1, s2);

	// 运算符重载实现对象相加
	s4 = operator+(s1, s2);

	// 运算符重载
	s5 = s1 + s2;






三、完整代码示例



代码示例 :

#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:
	int age;		// 年龄
	int height;		// 身高
};

// 使用普通方法实现两个 Student 对象相加
Student addStudent(Student& s1, Student& s2)
{
	Student s(s1.age + s2.age, s1.height + s2.height);
	return s;
}

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

int main() {
	// 基础数据类型相加
	int x = 10, y = 20;
	int z = x + y;
	// 打印计算结果
	cout << "z = " << z << endl;

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

	// 全局函数实现对象相加
	s3 = addStudent(s1, s2);

	// 运算符重载实现对象相加
	s4 = operator+(s1, s2);

	// 运算符重载
	s5 = s1 + s2;

	s3.print();

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

    return 0;
}

执行结果 :

z = 30
age = 28 , height = 290
age = 28 , height = 290
age = 28 , height = 290
请按任意键继续. . .

【C++】运算符重载 ① ( 运算符重载简介 | 运算符重载推衍 | 普通类型数据相加 | 对象类型数据相加 - 普通函数实现 / 运算符重载实现 | 运算符重载调用 - 函数名调用 / 运算符调 )_运算符_09


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   80   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   56   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   43   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   57   0   0 C++
K1I6GvxBEuyy
作者其他文章 更多