2 2 2 个 int 类型的 基础类型 变量 , 相加 , 就是两个数值相加 ;
int x = 10, y = 20;
int z = x + y;
如果是 2 2 2 个 类 对象 相加 , 那么相加的结果是什么 ?
// 自定义类型相加
Student s1(10, 120), s2(18, 170);
Student s3;
s3 = s1 + s2;
报错信息如下 :
error C2676: 二进制“+”:“Student”不定义该运算符或到预定义运算符可接收的类型的转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
这是因为没有对 自定义类 的 " + " 运算符 , 进行 " 运算符重载 " , 直接使用加法操作 , 会报错 ;
这里就需要为 类 设置 " 运算符重载 " , 才能进行类的相加操作 , 具体相加的结果 , 需要通过 重载的运算符函数的操作决定 ;
运算符重载 , 可以使 用户自定义数据 , 以 更简洁的方式 运作 ;
运算符重载 是 C++ 语言中的 一种特殊的语言特性 , 运算符重载 机制允许 开发者 为自定义类型 重新定义 运算符 的行为 ;
通过运算符重载 , 可以使 自定义类型 以 更自然 和 直观 的方式与 内置类型 进行交互 ;
要重载一个 运算符 , 需要在 类中 声明一个 成员函数 或 非成员函数 , 并使用 operator 关键字 修饰 要重载的 运算符函数 , 这个函数的 参数 和 返回类型 决定了运算符的行为 ;
基础数据类型相加 , 如 : int 类型 ;
可以直接计算 , 获得结果 ;
// 基础数据类型相加
int x = 10, y = 20;
int z = x + y;
// 打印计算结果
cout << "z = " << z << endl;
以下面的 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; // 身高
};
2 2 2 个 Student 对象不能直接相加 ,
Student s1(10, 120), s2(18, 170);
Student s3;
s3 = s1 + s2;
强行进行加法计算 , 会报如下错误 , 只能在一个函数中实现对象相加的计算逻辑 ;
报错信息如下 :
error C2676: 二进制“+”:“Student”不定义该运算符或到预定义运算符可接收的类型的转换
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
定义 addStudent 全局函数 , 接收 2 2 2 个 Student 类型对象 ;
在上述全局函数中 , 实现 2 2 2 个 Student 对象相加 ;
将其 age 和 height 成员分别相加即可 ;
// 使用普通方法实现两个 Student 对象相加
Student addStudent(Student& s1, Student& s2)
{
Student s(s1.age + s2.age, s1.height + s2.height);
return s;
}
调用时 , 将 2 2 2 个 Student 类型对象传入 addStudent 函数 , 即可完成 对象相加操作 ;
// 自定义类型相加
Student s1(10, 120), s2(18, 170);
Student s3 = addStudent(s1, s2);
将上述 addStudent 函数的 函数名修改为 operator+ , 就变成了 运算符重载 ;
// 使用 运算符重载 实现两个 Student 对象相加
Student operator+(Student& s1, Student& s2)
{
Student s(s1.age + s2.age, s1.height + s2.height);
return s;
}
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
请按任意键继续. . .