C++运算符重载

简介: C++运算符重载

什么是运算符重载

运算符重载就是运算符重新赋予运算能够操作自定义类型

注意:运算符重载的前提条件是必定存在一个自定义类型

运算符重载的实质就是函数的调用

两种方式

1.友元重载

2.类重载

重载的写法

运算符重载也是一个函数,只是函数名的写法不同,其余的跟函数的写法类似

函数的写法:

函数返回值类型 函数名(参数)

{

函数体

}

**> 运算符重载函数的写法:

函数名:operate加上运算符,就组成了函数名

参数:

类成员函数:参数个数 = 操作个数 - 1

友元函数:参数个数 = 操作个数

**

运算符重载的注意事项

注意:

1.在同一个自定义类型中,一个运算符只能被重载一次

2.C++重载只能重载已有的运算符,不能自己创造运算符

3.C++重载一般不能违背运算符原来有的含义,就算语法正确也不能够去违背

为什么要使用运算符重载

如图报错信息,编译器对于自定义类型的运算并不支持,这就需要我们进行运算符重载。

友元函数运算符重载

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  MM(int age, string name):age(age), name(name){}
  friend MM operator + (MM & object1, MM & object2); //友元函数运算符重载
  void print()
  {
    cout << name << age << endl;
   }
private:
  int age;
  string name;
};
MM operator + (MM & object1, MM & object2)
{
  return MM(object1.age + object2.age, object1.name); //注意:这里返回一个匿名对象
}
int main()
{
  MM mm1(10, "温柔了岁月");
  MM mm2(11, "温柔了岁月");
  MM mm3 = mm1 + mm2; //在vs中绿色的就是运算符重载   这是函数的隐式调用
  MM mm4 = operator + (mm1, mm2);  //函数的显示调用
  mm3.print();
  system("pause");
  return 0;
}

类成员函数运算符重载

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  MM(int age, string name):age(age), name(name){}
  MM operator + (MM& object)  //有一个是对象本身,所以比操作的数据成员少一个
  {
    return MM(this->age + object.age, this->name);
  }
  void print()
  {
    cout << age << name << endl;
  }
private:
  int age;
  string name;
};
int main()
{
  MM mm1(10, "温柔了岁月");
  MM mm2(12, "温柔了岁月");
  MM mm3 = mm1 + mm2; //隐式调用
  mm3.print();
  MM mm4 = mm1.operator + (mm2);  //显示调用
  mm4.print();
  system("pause");
  return 0;
}

特殊运算符重载

1.通常情况下,单目运算符用类成员函数重载,双目用友元重载

2. = ,(),->,[], 只能采用成员函数重载

=运算符重载

1.每个类都存在一个赋值运算符重载

2.你可以用delete删除默认的赋值运算符重载

3.你也可以在写一个赋值运算符重载,你也可以根据需要,自己在写一个赋值运算符重载只不过作用跟默认的不太一样

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  MM(int age, string name):age(age), name(name){}
private:
  int age;
  string name;
};
int main()
{
  MM mm1 = MM(10, "温柔了岁月"); //显式
  MM mm2(10, "温柔了岁月"); //隐式
  MM girl = mm1;  //每个类中都存在一个默认的赋值运算符重载
  system("pause");
  return 0;
}

++ ,–运算符重载

这比较特殊,++,–重载差不多,

主要学会区分前自增和后自增,前自减和后自减的重载函数的区别

方法:增加一个无用的参数,来区分

include<string>
#include <iostream>
using namespace std;
class MM
{
public:
  MM(int age, string name) : age(age), name(name) {}
  MM operator ++ () //前自增  
  {
    this->age++;
    return *this;
  }
  MM operator ++ (int)  //后自增 效率比第一种低,因为要创造对象,需要花时间
  {
    return MM(this->age++, this->name); 
  }
  void print()
  {
    cout << name << " " << age << endl;
  }
private:
  int age;
  string name;
};
int main()
{
  MM mm(10, "温柔了岁月");
  mm++;
  mm.print();
  MM mm2 = MM(10, "温柔了岁月");
  ++mm2;
  mm2.print();
  system("pause");
  return 0;
}

流运算符重载

输出流 << ,类型ostream

输入流 >> , 类型 istream

注意事项:

1.流重载必须要用引用的方式

2.流重载必须用友元函数重载(因为会修改一些私有的属性)

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  MM() {};
  MM(int age, string name) : age(age), name(name) {}
  friend ostream& operator << (ostream& out, MM& object1);
  friend istream& operator >> (istream& in, MM& object2);
private:
  int age;
  string name;
};
ostream& operator << (ostream& out, MM& object1) //输出流
 {
  out << object1.age << object1.name << endl;
  return out;
}
istream& operator >> (istream& in, MM& object2)  //输入流
{
  cout << "请输入年龄和名字" << endl;
  in >> object2.age  >> object2.name;
  return in;
}
int main()
{
  MM girl;
  cin >> girl;
  cout << girl << endl;
  system("pause");
  return 0;
}

()运算符重载

它实际上是一个仿函数

就是让类模仿函数调用的行为

后期在STL中,用于自己写自定义类型的比较

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  MM(){};
  MM(int age, string name) : age(age) , name(name) {}
  void operator ()()
  {
    cout << "无参" << endl;
  }
  void operator () (int a, int b)
  {
    cout << "有参" << endl;
  }
private:
  int age;
  string name;
};
int main()
{
  MM mm1(); 
  MM();
  MM{}(1, 2); // {}帮助识别,因为编译器不知道是调用函数,还是构造函数。
  MM mm2;
  mm2.operator()();
  mm2.operator()(1, 2); //显式调用
  MM mm3; 
  mm3();  //隐式调用
  mm3(1, 3);
  system("pause");
  return 0;
}


相关文章
|
26天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
70 5
|
6月前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
53 1
|
7月前
|
程序员 编译器 C++
C++中的运算符重载(Operator Overloading)
C++中的运算符重载(Operator Overloading)
62 1
|
3月前
|
C++
C++(十五) 运算符重载
C++中的运算符重载允许对已有运算符的功能进行重新定义,从而扩展语言功能、简化代码并提升效率。重载遵循特定语法,如 `friend 类名 operator 运算符(参数)`。重载时需注意不可新增或改变运算符数量、语义、优先级、结合性和返回类型。常见示例包括双目运算符 `+=` 和单目运算符 `-` 及 `++`。输入输出流运算符 `&lt;&lt;` 和 `&gt;&gt;` 也可重载。部分运算符只能作为成员函数重载。
|
6月前
|
存储 编译器 C++
【C++】:拷贝构造函数和赋值运算符重载
【C++】:拷贝构造函数和赋值运算符重载
31 1
|
6月前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
54 2
|
5月前
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
|
5月前
|
Java 程序员 C++
|
5月前
|
编译器 C++
【C++】详解运算符重载,赋值运算符重载,++运算符重载
【C++】详解运算符重载,赋值运算符重载,++运算符重载
|
6月前
|
编译器 C++
【C++】类和对象③(类的默认成员函数:赋值运算符重载)
在C++中,运算符重载允许为用户定义的类型扩展运算符功能,但不能创建新运算符如`operator@`。重载的运算符必须至少有一个类类型参数,且不能改变内置类型运算符的含义。`.*::sizeof?`不可重载。赋值运算符`=`通常作为成员函数重载,确保封装性,如`Date`类的`operator==`。赋值运算符应返回引用并检查自我赋值。当未显式重载时,编译器提供默认实现,但这可能不足以处理资源管理。拷贝构造和赋值运算符在对象复制中有不同用途,需根据类需求定制实现。正确实现它们对避免数据错误和内存问题至关重要。接下来将探讨更多操作符重载和默认成员函数。