【C++入门】(十七)运算符重载

1. 如何在成员函数中重载运算符?

1.1 前 / 后 缀运算符

  1. 前缀运算符: const Counter& operator++();

  2. 后缀运算符: const Counter operator++(int);

    后缀中 int 根本没有使用它,只是用来区分 前 / 后 缀运算符

复制代码
class Counter
{
  public:
  
  // 1.前缀运算符导致修改变量的值,再在表达式中使用修改后的新值
  const Counter& operator++();  //类内声明
  
  // 2.(int)表示后缀运算符,必须按值(而不是按引用)返回,否则函数返回时,将不再在作用域内
  const Counter operator++(int);  
  
  int value;
}
复制代码
// 1.前缀运算符(类外定义),const引用防误修改
const Counter& Counter::operator++()  
{
  ++value;
  return *this;
}
// 2.后缀运算符(类外定义),const引用防误修改
const Counter Counter::operator++(int)  
{
  Counter temp(*this);
  ++value;
  return temp;
}

 

1.2 加法运算符

运算符重载避免了显式调用函数,让程序更容易使用和理解

eg: gamma = Alpha + Beta; // 编译器将调用 gamma = Alpha.operator+(Beta);

gamma = Alpha.add(Beta); // 如果写一个add()方法来实现相同的功能

 

1.3 运算符重载的限制

  1. 运算符的优先级不能被重载改变。然而,圆括号能够强制改变表达式中重载运算符的求值顺序

  2. 重载运算符时不能创造新的运算符,即只能重载现有的运算符

  3. 不能将“+”运算符重载为减,运算符旨在方便使用和理解

  4. 关系运算符,如 ++= 必须被单独重载。

  5. 不能被重载的运算符:.(类属关系符)、.*(成员指针运算符)、::(作用域分辨符)和 ? :(三目运算符)。

 

2. 如何重载赋值运算符以管理内存?

2.1 赋值运算符

编译器自动生成默认赋值运算符重载同样是等位赋值(浅拷贝),会造成内存泄漏和重析构

复制代码
class A
{
  int num;
   c = new char[100];
};
​
int main()
{
  A a;
  A b;
  a = b;  //此时就是调用的赋值运算符重载
}
复制代码

 

要避免浅拷贝出现内存泄露的情况,那么就要自定义赋值运算符重载,使用深拷贝

复制代码
A & operator=(const A & other)
{
  if(this == &other)  // 判断右操作数是否为当前对象,以避免意外情况下对象赋给自己,被误释放
      return *this;
  
  //释放,再重新分配内存,避免内存泄露
  delete num;
  num = new int;
  num = other.getnum();
  return *this;  //返回新对象,链式编程
}
复制代码

 

2.2 赋值运算符和复制构造函数

  1. 复制构造函数使用现有对象创建新对象

  2. 赋值运算符修改现有对象,使其值和另一对象相同

 

3. 如何在类中包含动态分配的变量?

3.1 转换运算符

将对象转换为内置类型

复制代码
class Person 
{
public:
    int num =10;
    Person();  //默认构造函数
    Person(int NewNum);  //构造函数重载版本,接受一个int参数
};
​
Person::Person(int NewNum):
    num(NewNum)
{}
​
int main()
{
    int num1 = 20;
  
    Person P  = num1;  //将内置类型变量赋给类对象
    cout << P.num;     //P.num = 20
}
复制代码

 

3.2 int()运算符

复制代码
class Person 
{
public:
    int num;
    Person(); 
    Person(int NewNum);
    operator int();  //转换运算符
};
​
Person::Person(int NewNum):
    num(NewNum)
{}
​
Person::operator int(){ return (num); }  //返回成员变量num,和函数声明中返回类型匹配
int main()
{  
    Person P(100);
  
    int num1 = P;  //将类对象赋给内置类型变量
    cout << num1;  // num1 = 100
} 
复制代码
posted @   哟吼--小文文公主  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示