C++运算符重载:成员函数与友元函数的运用

需积分: 10 1 下载量 61 浏览量 更新于2024-07-14 收藏 213KB PPT 举报
"C++运算符重载是允许程序员为已有的运算符赋予新的含义,使得在面向对象编程中能够更加自然地表达类的操作。运算符重载并不创建新的运算符,而是让现有的运算符可以应用于自定义数据类型。这有助于增强代码的可读性和简洁性,实现类的多态性。在C++中,某些运算符无法被重载,如点运算符(.), 指针运算符(*), 三目运算符(?),作用域解析运算符(::)以及sizeof运算符。" 在实现运算符重载时,有以下两种方式: 1. **成员函数**:通常用于一元运算符和需要访问类内部私有或保护成员的二元运算符。例如,赋值运算符(=),自增自减运算符(++,--)。成员函数可以访问类的私有成员,因此当运算符需要修改类对象的状态时,使用成员函数更为合适。 2. **友元函数**:适用于大多数其他二元运算符,特别是当运算符涉及的对象类型不同,或者第一个操作数不是对象时。例如,输入输出运算符(<<, >>)。友元函数不隶属于任何类,但可以访问类的私有和保护成员,因此在处理非成员对象时更为灵活。 以下是一些关于运算符重载的规则和建议: - 对于一元运算符,如++和--,通常推荐使用成员函数来重载,因为它们直接作用于对象自身,需要修改对象状态。 - 当运算符需要在类对象之间进行操作,且需要修改对象状态(如+=, -=等),应使用成员函数。这是因为成员函数可以直接访问并修改对象的私有成员。 - 如果运算符的第一个操作数是非对象(如常量或基本类型),则需要使用友元函数,例如输入输出运算符(<<, >>)。 - 对于返回值,需要根据运算符的用途来决定。如果返回值可以被赋值(即可以出现在=号左边),则应返回非const引用;如果只能出现在右边,则返回const引用或const值;如果两边都可以出现,返回非const引用。 以下是一个关于`+`和`-`运算符重载的例子: ```cpp class Point { private: int x; public: Point(int x1) { x = x1; } Point(const Point& p) { x = p.x; } // 使用成员函数重载加法运算符 const Point operator+(const Point& p) { return Point(x + p.x); } // 使用友元函数重载减法运算符 friend const Point operator-(const Point& p1, const Point& p2); }; // 使用友元函数实现减法运算符 const Point operator-(const Point& p1, const Point& p2) { return Point(p1.x - p2.x); } ``` 在这个例子中,`Point`类的`+`运算符通过成员函数重载,而`-`运算符通过友元函数重载。这样,我们可以方便地对`Point`对象执行加减操作,同时保持类的封装性。