• C++ 运算符重载_加号


    C++运算符重载

    C++运算符重载是C++中一个非常重要的概念,很多初学者(包括我)在刚开始学习的时候非常害怕,甚至讨厌(也许是恶心)。但是,不得不说的是,它真的很重要,学会之后很方便(ZhuangBi)。


    加号运算符重载

    加号是一个典型的双目运算符(需要两个操作数),加号前一个,加号后一个。实现加号运算符重载有两种方式:1.类成员方法实现、2.全局方法实现

    1.类成员方法实现

    谈一下我对加号运算符重载的理解,因为如果不理解原理,就会觉的运算符重载语法有点(变态),如果只想知道实现方法的请直接跳到代码部分

    在没有使用运算符重载之前,我们实现两个自定义类型相加通常都是使用类成员函数实现的。比如下图这种:

    其中 p1.addPerson(p2) 就等价于 p1 + p2

    而加号的运算符重载也是一个函数,不过名字比较奇怪而已:operator+( )

    可以理解为,两个对象相加时等价于 p1.addPerson(p2)  然后经过编译器优化后,可以简写为  p1 + p2。所以在成员方法实现运算符重载时仅仅需要传入一个参数(另外一个是隐藏的this指针)。

    我想表达的意思大概就像上图这样,基本上就是 p1 + p2 只是 p1.operator+ (p2) 这个比较奇怪函数的简写,而这个函数本身和addPerson()没什么区别,仅仅是名字上的区别而已。

    类成员方法实现 完整代码

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Person {
     5 public:
     6     Person();
     7     Person(int val);
     8     Person operator+(const Person& p);//运算符重载 函数定义
     9 private :
    10     int m_age;
    11 };
    12 
    13 int main() {
    14     Person p1;
    15     Person p2;
    16     Person p3 = p1 + p2;//重载后的效果
    17     return 0;
    18 }
    19 
    20 Person::Person() :m_age(10) {
    21     cout << "无参构造函数" << endl;
    22 }
    23 Person::Person(int val) : m_age(val) {
    24     cout << "有参构造函数" << endl;
    25 }
    26 Person Person:: operator+(const Person& p) {//运算符重载 实现
    27     Person tmp;
    28     tmp.m_age = this->m_age + p.m_age;
    29     return tmp;
    30 }

    2.全局方法实现

    对于全局方法的实现,就类似于定义了一个全局函数实现两个对象相加,如下图:

    而运算符重载函数(下面完整代码的13~17行),也只是一个具有特殊名称(operator+)的相加函数而已,它和 add 函数没有本质上的区别。

    调用上也应该是一样的 operator+( p1, p2),不过我们不能这么写,而是写了 p1 + p2 ,在编译器内部把这个表达式 当作 operator+( p1, p2 )处理。

    全局方法实现 完整代码

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class Person {
     5 public:
     6     friend Person operator+(Person& p1, Person& p2);//把全局方法设为友元函数,便于访问私有变量
     7     Person() :m_age(0) {}//初始化一个值
     8     Person(int val) :m_age(val) {}
     9 private:
    10     int m_age;
    11 };
    12 //2.全局的重载方法
    13 Person operator+(Person& p1, Person& p2) {
    14     Person tmp;
    15     tmp.m_age = p1.m_age + p2.m_age;
    16     return tmp;
    17 }
    18 
    19 int main() {
    20     Person p1(10);
    21     Person p2(11);
    22     Person p3 = p1+p2;
    23     return 0;
    24 }
  • 相关阅读:
    工作交接
    .NET 利用反射将对象数据添加到数据库
    【C#】IPAddress.Any 解决本地ip和服务器ip切换问题
    【C#】警告System.Configuration.ConfigurationSettings.AppSettings" 已过时
    【C#】TcpListener的对象“已过时”的编译警告
    大城小胖这几年积累的动画库、手势库、物理引擎库
    select option项选择后跳转页面
    360引起的Soap的java.io.EOFException错误
    linux安装mysql-5.7.22与数据自动备份
    性能测试流程
  • 原文地址:https://www.cnblogs.com/PPWEI/p/11992365.html
Copyright © 2020-2023  润新知