【C++】重载运算符+-=>/*[]==++-- MyString 智能指针(* ->)

news2024/11/29 20:49:17

目录

15.重载运算符

15.1 eg.Person

15.2 eg.MyString

15.3 智能指针


15.重载运算符

  • 定义:给原有的运算符赋予新的意义。

  • 为什么重载<<或>>一定要用友元?

    如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。

    而 >> 或<< 左侧运算量是 cincout 而不是对象本身,所以不满足左侧运算量就是对象本身的特点。所以要申明为友元函数。

    如果一定要声明为成员函数,只能成为如下的形式:

    ostream & operator<<(ostream &output){
      return output;
    }

    所以在运用这个<<运算符时就变为:data<<cout;

    不符合习惯。

15.1 eg.Person

#include<iostream>
using namespace std;
class Person {
private:
     string name;
     int age;
     float weight;
public:
     Person();
     Person(string, int, float);
     ~Person();
​
     friend ostream& operator<<(ostream& out, Person& ob);
     friend istream& operator>>(istream& in, Person& ob);
     friend Person operator+(Person& ob1, Person& ob2);
     friend Person operator-(Person& ob1, Person& ob2);
     friend Person operator*(Person& ob1, Person& ob2);
     friend Person operator/(Person& ob1, Person& ob2);
     friend Person operator++(Person& ob);//前置++
     friend Person operator++(Person& ob,int t);//后置++
     friend Person operator--(Person& ob);//前置--
     friend Person operator--(Person& ob,int t);//后置--
     friend bool operator==(Person& ob1, Person& ob2);
};
​
Person::Person() {
     name = "YY";
     age = 19;
     weight = 55.5;
}
​
Person::Person(string _name, int _age, float _weight) {
     name = _name;
     age = _age;
     weight = _weight;
}
​
Person::~Person() {
     //cout << "~Person" << endl;
}
​
ostream& operator<<(ostream& out, Person& ob) {
     cout << "name:" << ob.name <<" "
          <<"age:" <<ob.age<<" "
          <<"weight:"<<ob.weight<< endl;
     return out;
}
istream& operator>>(istream& in, Person& ob) {
     Person(ob.name, ob.age, ob.weight);
     return in;
}
Person operator+(Person& ob1, Person& ob2) {
     Person ob3;
     ob3.age=ob1.age + ob2.age;
     ob3.weight = ob1.weight + ob2.weight;
     ob3.name = ob1.name + ob2.name;
     return ob3;
}
​
Person operator-(Person& ob1, Person& ob2) {
     Person ob3;
     ob3.age = ob1.age - ob2.age;
     ob3.weight = ob1.weight - ob2.weight;
     return ob3;
}
Person operator*(Person& ob1, Person& ob2) {
     Person ob3;
     ob3.age = ob1.age * ob2.age;
     ob3.weight = ob1.weight * ob2.weight;
     return ob3;
}
​
Person operator/(Person& ob1, Person& ob2) {
     Person ob3;
     ob3.age = ob1.age / ob2.age;
     ob3.weight = ob1.weight / ob2.weight;
     return ob3;
}
​
Person operator++(Person& ob) {
     ob.age++;
     ob.weight++;
     ob.name += ob.name;
     return ob;
}
​
Person operator++(Person& ob, int t) {
     Person old = ob;
     ++ob;
     return old;
}
​
Person operator--(Person& ob) {
     ob.age--;
     ob.weight--;
     return ob;
}
​
Person operator--(Person& ob, int t) {
     Person old = ob;
     --ob;
     return old;
}
​
bool operator==(Person& ob1, Person& ob2){
     if (ob1.age == ob2.age && ob1.weight == ob2.weight) {
          return true;
     }
     return false;
}
​
int main() 
{
     Person ob1;
     Person ob2("CC", 20, 66.66);
     Person temp;
​
     cout << "Test <<:" << endl;
     cout << ob1 << endl;
     cout << ob2 << endl;
​
     cout << "\nTest >>:" << endl;
     cin >> temp ;
​
     cout << "\nTest -:" << endl;
     temp = ob2 - ob1;
     cout << temp << endl;
​
     cout << "\nTest +:" << endl;
     temp = ob2 + ob1;
     cout << temp << endl;
​
     cout << "\nTest a++:" << endl;
     ob1++;
     cout<< ob1 << endl;
​
     cout << "\nTest ++a:" << endl;
     ++ob1;
     cout << ob1 << endl;
​
     cout << "\nTest a--:" << endl;
     ob2--;
     cout << ob2 << endl;
​
     cout << "\nTest --a:" << endl;
     --ob2;
     cout << ob2 << endl;
​
     cout << "\nTest ==:" << endl;
     bool f=(ob1==ob2);
     cout << f << endl;
}

 

15.2 eg.MyString

#include<iostream>
#include<string>
using namespace std;
​
class MyString {
private:
     int size;
     char* str;
public:
     MyString();
     MyString(const char*s); //一定要有const
     ~MyString();
​
     friend ostream& operator<<(ostream& out, MyString ob);
     friend istream& operator>>(istream& in, MyString &ob);//一定要有&
     MyString operator+(MyString ob);
     MyString operator=(MyString ob);
     bool operator>(MyString ob);
     char &operator[](int i);//获取字符串中的一个字符
};
​
MyString::MyString() {
     size = 0;
     str = NULL;
}
​
MyString::MyString(const char* _str){
     size = strlen(_str);
     str = new char[size + 1];
     strcpy(str, _str);
}
​
MyString::~MyString() {
     //cout << "\n~MyString" << endl;
}
​
ostream& operator<<(ostream& out, MyString ob) {
     out << ob.str;
     return out;
}
​
istream& operator>>(istream& in, MyString &ob) {
     char temp[99];
     cin >> temp;
     if (ob.str != NULL) {
          delete[]ob.str;
          ob.str = NULL;
     }
     ob.size = strlen(temp);
     ob.str = new char[ob.size + 1];
     strcpy(ob.str, temp);
     return in;
}
​
MyString MyString::operator+(MyString ob) {
     MyString temp;
     temp.size=size + ob.size;
     temp = new char[temp.size + 1];
     strcpy(temp.str, str);
     strcat(temp.str, ob.str);
     return temp;
}
​
MyString MyString::operator=(MyString ob) {
     size = ob.size;
     if (str != NULL) {
          delete[]str;
          str = NULL;
     }
     str = new char[size+1];
     str = ob.str;
     return *this;
}
​
bool MyString::operator>(MyString ob) {
     if (strcmp(str, ob.str)) {
          return true;
     }
     return false;
}
​
char& MyString::operator[](int i) {
     return str[i];
}
​
int main() 
{
     MyString ob1;
     MyString ob2("YY");
     MyString temp;
​
     cout << "Test <<" << endl;
     cout << ob2 << endl;
​
     cout << "\nTest >>" << endl;
     cin >> temp;
     cout << temp << endl;
​
     cout << "\nTest =" << endl;
     ob1 = ob2;
     cout << ob1 << endl;
​
     cout << "\nTest +" << endl;
     temp = ob1 + ob2;
     cout << temp << endl;
​
     cout << "\nTest >" << endl;
     bool f=temp>ob1;
     cout << f<< endl;
}

 

  • 析构函数的调用顺序:

    #include<iostream>
    #include<string>
    using namespace std;
    ​
    class MyString {
    private:
         int size;
         char* str;
         string name;
    public:
         MyString();
         MyString(const char*s,string _name); //一定要有const
         ~MyString();
    ​
         friend ostream& operator<<(ostream& out, MyString ob);
         friend istream& operator>>(istream& in, MyString &ob);//一定要有&
         MyString operator+(MyString ob);
         MyString operator=(MyString ob);
         bool operator>(MyString ob);
         char &operator[](int i);//获取字符串中的一个字符
    };
    ​
    MyString::MyString() {
         size = 0;
         str = NULL;
    }
    ​
    MyString::MyString(const char* _str,string _name){
         cout << "Create:" << _name << endl;
         size = strlen(_str);
         str = new char[size + 1];
         strcpy(str, _str);
         name = _name;
    }
    ​
    MyString::~MyString() {
         cout << "\n~MyString:"<<this->name << endl;
    }
    ​
    ostream& operator<<(ostream& out, MyString ob) {
         out << ob.str;
         return out;
    }
    ​
    istream& operator>>(istream& in, MyString &ob) {
         char temp[99];
         cin >> temp;
         if (ob.str != NULL) {
              delete[]ob.str;
              ob.str = NULL;
         }
         ob.size = strlen(temp);
         ob.str = new char[ob.size + 1];
         strcpy(ob.str, temp);
         return in;
    }
    ​
    MyString MyString::operator+(MyString ob) {
         MyString temp;
         temp.size=this->size + ob.size;
         temp.str = new char[temp.size+1];
         strcpy(temp.str, this->str);
         strcat(temp.str, ob.str);
         return temp;
    }
    ​
    MyString MyString::operator=(MyString ob) {
         size = ob.size;
         if (str != NULL) {
              delete[]str;
              str = NULL;
         }
         str = new char[size+1];
         str = ob.str;
         return *this;
    }
    ​
    bool MyString::operator>(MyString ob) {
         if (strcmp(str, ob.str)) {
              return true;
         }
         return false;
    }
    ​
    char& MyString::operator[](int i) {
         return str[i];
    }
    ​
    int main() 
    {
         MyString ob1("S","ob1");
         MyString ob2("YY","ob2");
         MyString temp("T","temp");
    ​
         cout << "Test <<" << endl;
         cout << ob2 << endl;
    ​
         cout << "Test >>" << endl;
         cin >> temp;
         cout << temp << endl;
    ​
         cout << "Test =" << endl;
         ob1 = ob2;
         cout << ob1 << endl;
    ​
         cout << "Test +" << endl;
         temp = ob1 + ob2;
         cout << temp << endl;
    ​
         cout << "Test >" << endl;
         bool f=temp>ob1;
         cout << f<< endl;
    }

     

15.3 智能指针

(指针运算(*、->)重载)

  • 作用:解决 堆区空间的对象 释放问题。(手动怕忘)

    智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而避免内存泄漏

#include<iostream>
using namespace std;
​
class Data {
private:
     int a;
public:
     Data();
     Data(int);
     ~Data();
     void Datafuc();
};
​
class smartpoint {
private:
     Data* p;
public:
     smartpoint();
     smartpoint(Data* p);
     ~smartpoint();
​
     Data* operator->();
     Data& operator*();
};
​
Data::Data() {}
Data::Data(int _a) {
     a = _a;
}
Data::~Data() {
     cout << "~Data" << endl;
}
void Data::Datafuc() {
     cout << "smartpoint调用Datafuc" << endl;
}
​
smartpoint::smartpoint() {
     *p = NULL;
}
smartpoint::smartpoint(Data* _p) {
     p = _p;
}
smartpoint::~smartpoint() {
     cout << "~smartpoint" << endl;
}
​
Data& smartpoint::operator*() {
     cout << "重载运算符*" << endl;
     return *p;
}
Data* smartpoint::operator->() {
     cout << "重载运算符->" << endl;
     return this->p;
}
​
int main()
{
     Data da(5);
     smartpoint sp(&da);
​
     //重载运算符调用函数
     sp->Datafuc();
     (*sp).Datafuc();
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10年老码农亲授:什么是分布式系统

首先&#xff0c;分布式系统是在硬件成本日益提高&#xff0c;或者单机提升的成本过于昂贵而程序的问题得不到解决时&#xff0c;为了解决更加高效、内容量更大的数据而采取的一种解决手段。 而分布式系统又分为两个部分&#xff0c;计算和存储&#xff0c;而准确来说这两部分…

知行之桥EDI系统2022版Tomcat部署

1.首先需要下载Tomcat&#xff0c;可在Tomcat官网获取&#xff0c;本部署步骤以apache-tomcat-9.0.67.tar.gz为例&#xff0c;通过XFTP将该包放在服务器上的指定位置&#xff0c;如/opt/test 进入/opt/test文件夹后&#xff0c;在命令行执行以下命令对该包进行解压缩 tar -zxv…

大数据毕设 - 公交数据分析与可视化系统(大数据 python flask)

文章目录0 前言1 课题背景2 具体实现3 Flask框架4 ECharts可视化工具5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越…

Smart Tomcat + Servlet API的应用

文章目录前言一、Smart Tomcat二、Servlet API1.HttpServlet&#xff08;1&#xff09;方法&#xff08;2&#xff09;描述servlet的生命周期&#xff08;3&#xff09;案例2.HttpServletRequest&#xff08;1&#xff09;方法&#xff08;2&#xff09;代码示例打印请求信息获…

若依框架图片上传、富文本框编辑器功能

文章目录一、前言二、效果三、编码过程1.前端&#xff1a;index.vueprojectShow.js富文本框: Editor/index.vue图片上传&#xff1a;ImgUploadCropper/index.vue2.后端&#xff1a;实体ProjectShowProjectShowControllerIProjectShowServiceProjectShowServiceImplProjectShowM…

Linux命令大全

前言 Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发&#xff0c;接触 Linux机会相对较少&#xff0c;因此往往容易忽视它。但是学好它却是程序员必备修养之一。 作者使用的是阿里云服务器 ECS &#xff08;最便宜的那种&#xff09; CentOS 7.7 64位…

指针初阶(C语言)

指针 指针是什么 内存划分是一个字节一个字节来划分的&#xff0c;其中每个字节都有一个编号来标识它&#xff0c;我们将这个编号称为地址&#xff0c;而指针就是地址 注意&#xff1a;编号是不占内存空间的&#xff0c;&#xff08;这些编号在内存中用十六进制表示&#xff0…

正厚软件 | App测试面试题及参考答案

最近整理了一些关于App测试的面试题。 本参照答案是本人在工作实践中总结&#xff0c;仅代表个人观点&#xff0c;如有错误&#xff0c;请谅解。 问&#xff1a;说一些你在测试过程中常用到的adb命名 答&#xff1a;回答本问题时&#xff0c;首先不要想到哪个命名就说哪个命令…

锐捷ISIS基础实验

目录 ISIS理论讲解 配置ISIS邻居建立 配置路由渗透&#xff08;泄露&#xff09; ISIS其它的配置特性 配置ISIS时间属性 配置ISIS认证 ISIS理论讲解 ISIS——基本概念1&#xff08;邻居建立、路由计算、报文封装&#xff09;_静下心来敲木鱼的博客-CSDN博客https://blog…

2022年全球高被引科学家公布

博士后、访问学者及联合培养申请者&#xff0c;都希望去名校及牛导麾下深造。名校有世界几大排名体系做参考&#xff0c;其知名度毋庸置疑。但牛导的概念是什么呢&#xff1f;知识人网小编在此介绍最新推出的“2022年度高被引科学家”&#xff0c;这里云集了全球自然科学和社会…

教你使用 SO_REUSEPORT 套接字选项提升服务性能

前言 Linux 网络栈中有一个相对较新的特性——SO_REUSEPORT 套接字选项&#xff0c;可以使用它来提升你的服务性能。 图 1: 上面的服务是使用并行监听器来避免请求连接瓶颈&#xff0c;而下面的服务只使用一个监听器来接收连接 概要 HAProxy 和 NGINX 是少数几个使用 Linux …

线段树什么的不是简简单单嘛,我教你!:基础篇

线段树什么的不是简简单单嘛&#xff0c;我教你&#xff01;&#xff1a;基础篇 零、序言——万物滴开篇 也许你是苦于笔试的打工人&#xff0c;也许你是步入算法圈不久的小小萌新&#xff08;我也是萌新&#xff09; &#xff0c;也许你是在网上搜索数据结构课设的倒霉学生。…

2049. 统计最高分的节点数目-数组树构造+遍历求解最大值数目

2049. 统计最高分的节点数目-数组树构造遍历求解最大值数目 给你一棵根节点为 0 的 二叉树 &#xff0c;它总共有 n 个节点&#xff0c;节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树&#xff0c;其中 parents[i] 是节点 i 的父节点。由于…

音视频 - 视频编码原理

目录 视频编码主要分为 图像的冗余 熵编码 帧内预测 帧间预测 DCT变换和量化 编码器比较 清晰度和耗时对比 一部电影1080P&#xff0c;帧率25fps&#xff0c;时长2小时&#xff0c;文件大小 1920x1080x1.5x25x2x360 521.4G 数据量非常大&#xff0c;对存储和网络传输都…

GMC Graph-Based Multi-View Clustering

GMC Graph-Based Multi-View Clustering 基于图的多视图聚类 abstract 现有的大多数方法没有充分考虑不同视图的权重&#xff0c;需要额外的聚类步骤来生成最终的聚类。还通常基于所有视图的固定图相似矩阵来优化目标。 本文提出了一种通用的基于图的多视图聚类算法(GMC)来解…

Android程序设计之学生考勤管理系统

基于安卓平台开发的学生考勤管理系统&#xff0c;本系统采用java语言设计&#xff0c;数据存储使用SQLite轻量级数据库实现 SQLite 简介 SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎&…

JSON 对比工具

文章目录JSON对比工具JSON对比工具 JSON 是 Web 开发领域中最常用的数据传输格式之一&#xff0c;因为 JSON 的可读性较高&#xff0c;对于一些简单的 JSON 数据&#xff0c;我们不需要借助任何工具就可以轻易的读取。但对于复杂的 JSON 数据就需要借助工具才行&#xff0c;本…

公众号文案写作技巧有哪些?教你几招

公众号文案写作是每个公众号运营者心中的痛&#xff1a; 你是否每天纠结写什么&#xff1f; 你是否写着写着就词穷了&#xff1f; 你是否不知道该如何下手&#xff1f; 公众号文案应该怎么写&#xff1f;今天伯乐网络传媒就来给大家分享一份超实用的公众号文案写作技巧&…

增量模型和迭代模型的优点与缺点

增量模型&#xff1a; 举个例子&#xff1a; 用户有一个需求&#xff0c;功能包含A,B,C... ABC 增量模型&#xff1a; 开发完A我就直接上线供给用户去使用 开发完C我就直接上线供给用户去使用 开发完B我就直接上线供给用户去使用 增量模型的特点 增量模型的特点…

度量BGP监测源数量对AS可见性的影响

首先&#xff0c;本文介绍了两个公开的BGP数据源项目情况&#xff1b;其次&#xff0c;从可见AS数量和可见AS边关系数量两个方面来分析度量BGP监测源中对等AS的可见性。 BGP数据源介绍 BGP数据源有2个公开的项目&#xff0c;分别是RIPE RIS和Route Views&#xff0c;它们使用路…