重载运算符总结

重载运算符

一重载运算符的限制

在我们定义了类之后,出现了一些新的数据类型,因此我们要根据数据类型的不同要重新编写我们的运算符,在c++中大部分的预定义的运算符都可以被重载,但以下运算符不能被重载 "." ".*" "::" "?" "sizeof"。

重载运算符函数可以对运算符做出新的解释,即定义用户所需要的各种操作。但运算符重载后,原有的基本语句不变,包括

1 不改变运算符的优先级

2 不改变运算符的结合性

3 不改变运算符所需要的操作数

要注意的是不能创新的运算符,只有系统预定义的运算符才能被重载。

二重载运算符的语法形式

运算符函数是一种特殊的成员函数或友元函数。成员函数的语句格式为:

类型 类名::operator op(参数表)

{

//相对于该类定义的操作

}

类型是函数的返回类型。“类名”是要重载该运算符的类。“op”表示要重载的运算符“参数表”列出该运算符所需要的操作数

重载运算符的函数不能有默认参数. 
重载的运算符必须和用户定义的自定义类型一起使用,其参数至少应有一个是类对象(或类对象的引用) 
防止用户修改用于标准数据类型的运算符
用于类对象的运算符一般必须重载,但有两个例外“=”和“&”不必重载 
"=”,系统有默认的重载函数,就是逐个复制成员,除非有必要(像动态分配内存的内容)就不必重载 
"&",它能返回类对象在内存中的起始地址 
要按习惯重载,虽然可以但还是不要把“+”重载成 减法,否则有违重载的初衷 

运算符重载函数可以是类成员函数(如“+”左边必须是类),类友元函数(需要访问类私有成员时使用很方便),普通函数(访问类私有成员时不太方便) 

重载运算符有两种方式

一种是成员函数重载运算符,另一种是友元函数重载运算符。

重载为类的成员函数

返回类型(类名::)operator运算符(形参表){函数体;}

重载为类的友元函数

friend 函数类型 operator 运算符(形参表){函数体;}

通过友元关系可以实现不同类或对象的成员函数之间,类的成员函数与一般函数之间进行数据共享机制。我们先在类中声明这几个重载函数为该类的友元,这里要注意此时重载函数的参数有两个而不是一个,友元函数需要两个参数分别调用在主函数往里面传递的值,友元函数最大的好处就是能够调用类中的私有数据成员,还能保证类的封装性。所以我认为一般用友元函数重载运算符要比用成员函数重载要好用。

  1. #include <iostream>  
  2. using namespace std;  
  3. class Coordinate  
  4. {  
  5. public:  
  6.     Coordinate(int x, int y)  
  7.     {  
  8.         m_iX = x;  
  9.         m_iY = y;  
  10.     }  
  11.     Coordinate &operator--()  
  12.     {  
  13.         this->m_iX--;  
  14.         this->m_iY--;  
  15.         return *this;  
  16.     }  
  17.     Coordinate operator--(int)  
  18.     {  
  19.         Coordinate coor(*this);  
  20.         coor.m_iX=this->m_iX--;  
  21.         coor.m_iY=this->m_iY--;  
  22.         return coor;  
  23.     }  
  24.     Coordinate operator+(Coordinate &c)  
  25.     {  
  26.         Coordinate temp(0,0);  
  27.         temp.m_iX=this->m_iX+c.m_iX;  
  28.         temp.m_iY=this->m_iY+c.m_iY;  
  29.         return temp;  
  30.     }  
  31. public:  
  32.     int m_iX;  
  33.     int m_iY;  
  34. };  
  35.   
  36. int main(void)  
  37. {  
  38.     Coordinate coor1(1, 3);  
  39.     Coordinate coor2(2, 4);  
  40.     Coordinate coor3(0, 0);  
  41.   
  42.     coor1--;  
  43.     --coor2;  
  44.     coor3 = coor1 + coor2;  
  45.   
  46.     cout << coor3.m_iX << endl;  
  47.     cout << coor3.m_iY << endl;  
  48.   
  49.     return 0;  
  50. }  

### 运算符重载的概念和实现方法 运算符重载是一种在编程语言中允许用户自定义数据类型(如类)支持标准运算符操作的技术。通过运算符重载,可以为用户定义的类型提供与内置类型类似的表达式书写方式,从而增强代码的可读性和简洁性[^1]。 #### 一、运算符重载的基本规则 在实现运算符重载时,需要遵循以下规则: - 至少有一个操作数是用户定义的类型。 - 改变运算符原有的语法规则。 - 无法创建新的运算符,只能对现有运算符进行重载。 - 某些运算符(如 `sizeof`)能被重载。 - 赋值运算符 `=`、函数调用运算符 `()`、下标运算符 `[]` 和成员访问运算符 `->` 必须作为类的成员函数进行重载[^2]。 #### 二、运算符重载的实现方式 运算符重载可以通过两种方式实现:类内实现和类外实现。 ##### 1. 类内实现 将运算符重载函数定义为类的成员函数。这种方式适用于需要访问类私有成员的情况。例如,赋值运算符重载通常以这种方式实现: ```cpp #include <iostream> using namespace std; class Data { private: int value; public: // 构造函数 Data(int val = 0) : value(val) {} // 赋值运算符重载 Data& operator=(const Data& other) { if (this != &other) { // 防止自我赋值 value = other.value; } return *this; } // 打印函数 void print() const { cout << "Value: " << value << endl; } }; int main() { Data d1(10), d2; d2 = d1; // 调用赋值运算符重载 d2.print(); return 0; } ``` 上述代码展示了如何在类内实现赋值运算符重载。当一个对象被赋值给另一个对象时,会调用该重载函数[^3]。 ##### 2. 类外实现 如果运算符需要访问类的私有成员,可以将其定义为类的友元函数或普通函数。这种方式适用于二元运算符,如加法运算符 `+` 或减法运算符 `-`。 ```cpp #include <iostream> using namespace std; class Vector { private: int x, y; public: Vector(int _x = 0, int _y = 0) : x(_x), y(_y) {} // 友元函数声明 friend Vector operator+(const Vector& v1, const Vector& v2); void print() const { cout << "Vector(" << x << ", " << y << ")" << endl; } }; // 类外实现加法运算符重载 Vector operator+(const Vector& v1, const Vector& v2) { return Vector(v1.x + v2.x, v1.y + v2.y); } int main() { Vector v1(1, 2), v2(3, 4), v3; v3 = v1 + v2; // 调用加法运算符重载 v3.print(); return 0; } ``` 上述代码展示了如何通过友元函数实现加法运算符重载[^4]。 #### 三、注意事项 - 在实现赋值运算符重载时,需注意防止自我赋值问题。 - 如果未显式定义赋值运算符重载函数,编译器会生成一个默认版本,但可能无法满足复杂对象的需求。 ### 示例总结 通过上述示例可以看出,运算符重载的核心在于根据需求定义适当的重载函数,并确保其逻辑正确且符合语言规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值