【无标题】

1、引入


在C++中,基本类型的数据(如整型、浮点型等)可以通过运算符直接进行运算,然而,使用自定义类时,例如在表示某个人的资金情况时,类对象之间的运算却没有这样简便的方式。
假设现在有一个类的实现如下:

class person
{
public:
	double cash;	// 表示个人持有的资金
};

现在将这个类实例化,得到TomJohn两个对象。若需要计算Tom和John二人手中共持有多少资金,最简单的方法是

double total = Tom.cash + John.cash

虽然这种方式简单直观,但它违背了封装原则,增加了维护成本。

为解决这一问题,C++ 提供了运算符重载机制,使自定义类的对象也能像基本类型一样进行运算,从而提高代码的可读性与简洁性。

2、重载运算符定义与使用

重载运算符,本质上也是函数的一种,使用关键字operator加上运算符作为函数名,运算符函数的格式大致如下:

返回值类型 operator 运算符(形参列表)
{
	...
}
  • 使用成员函数的重载

使用成员函数可以直接访问对象的成员变量,重载 + 运算符的示例如下:

class person
{
public:
	double cash; // 表示个人持有的资金
	double operator+(const person& s) // 重载之后的+运算符
    {
        return this->cash + s.cash;
    }
}

main() 函数中,可以像对待基本类型一样对类对象进行运算:

int main() {
    person Tom{1500.75}, John{2000.25};
    double total = Tom + John;  // 直接使用 + 进行运算
    std::cout << "Tom 和 John 的总资金为: " << total << std::endl;
    return 0;
}

通过成员函数重载,Tom + John 将自动调用 operator+,其中 this 指向左操作数 Tom

  • 非成员函数的重载

有时运算不与特定对象相关,例如对两个对象进行简单的比较或加法运算,可以使用非成员函数来重载运算符:

class person
{
public:
	double cash; // 表示个人持有的资金
};

// 重载的+运算符
double operator+(const person& s1, const person& s2)
{
	return s1.cash + s2.cash;
}

int main() {
    person Tom{1500.75}, John{2000.25};
    double total = Tom + John;  // 直接使用 + 进行运算
    std::cout << "Tom 和 John 的总资金为: " << total << std::endl;
    return 0;
}

这种方法也可以简化代码逻辑。然而非成员函数只能访问类的公开成员,如果 `cash` 是私有的,将无法访问。

重载运算符时,涉及到封装性问题,尤其是在非成员函数重载的情况下,可以使用 friend 关键字处理,后续会讲。
3、重载运算符的限制

1、用户定义类型参与:重载的运算符至少有一个操作数必须是用户定义的类型,防止用户为标准类型重载运算符;
2、遵循语法规则:运算符重载不能改变原有的语法规则或运算符的优先级。例如,不能将加号(+)重载为减法运算。
3、禁止新运算符:不能创建新的运算符,例如不能定义 operator** 来表示幂运算。
4、不可重载的运算符
        sizeof:sizeof 运算符。
        .:成员运算符。
        .*:成员指针运算符。
        :::作用域解析运算符。
        ?::条件运算符。
        typeid:—个 RTTI 运算符。
        const_cast:强制类型转换运算符。
        dynamic_cast:强制类型转换运算符。
        reinterpret_cast:强制类型转换运算符。
        static_cast:强制类型转换运算符。
5、仅能通过成员函数重载的运算符
        =: 赋值运算符。
        ( ):函数调用运算符。
        [ ]:下标运算符。
        ->:访问类成员的运算符。

4、运算顺序与兼容性问题

在运算符重载中,运算的本质依然是函数调用,参数的顺序至关重要。这意味着有时用户可能会使用不同的顺序调用运算符,而编译器无法处理。例如,定义了对某个对象乘以一个倍数的运算:

 A = B * 2.75 

但如果用户写成 :A = 2.75 * B,编译器就会报错,因为 2.75 不是类对象,无法调用重载的运算符。

在运算符重载时,应考虑各种可能的调用方式,以提高代码的鲁棒性,避免因不符合预期的输入导致程序出错。

总结:

  • 运算符重载可以提升代码的可读性和简洁性,使类对象操作更直观。
  • 适当应用:运算符重载应用于具有自然映射关系的场景,例如数学运算、比较等,避免在不合适的场景滥用运算符重载,导致代码混乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值