C++(16)--运算符重载(自定义Integer类)

运算符重载

  • 1.运算符重载--重点
  • 2.友元函数--难点(流运算符重载)

《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------

C++创始人:要轻松的使用这种语言,不要觉得必须使用所有的特性,不要在第一次学习的时候就试图使用所有的特性。

1.运算符重载–重点

1.函数的重载和参数有关,和函数名无关。
2.运算符重载就是“想法的转换”,它的目标是简化函数调用的方式。
3.把标准的函数使用方式,重新定义成自己认为的方式。给符号赋予新的含义,使得一个运算符可以拥有不同的功能。

实际上:我们已经用过了很多运算符的重载,C++本身已经对这些运算符进行了重载

  1. +号可以实现不同类型数据的加法操作。
  2. << 既是位移运算符,又可以配cout 实现控制台数据的输出

两个对象想要进行相加,必须进行运算符重载。重载的一个效果是为了是为了美观

小试牛刀:定义一个运算符重载,就像是定义了一个函数,只不过这个函数名称以关键字operator开头.

运算符重载的语法格式为:

返回类型 operater被重载的运算符(参数列表)

编译器实际调用:

num3 = num1.operator+(num2);

demo1:重载加法运算符1

//mian.cpp
#include <iostream>
#include "Integer.h"
using namespace std;
void TestInteger();
void TestIntefer()
{Integer int1(1024), int2(2048),int3;int3 = int1 + int2;cout << "int3 = int1 + int2的结果为" << int3.Intvalue()<< endl;
}
int main() {TestIntefer();return 0;
}
//Integer.h
//
// Created by 陈莹莹 on 2021/2/14.
// 我们自己定义的整型类,将整型封装成类,以便面向对象的封装#ifndef CHAPTER12_INTEGER_H
#define CHAPTER12_INTEGER_Hclass Integer {
public:Integer();Integer(int value):m_value(value){}// 重载加号运算符Integer operator+(Integer other);int Intvalue(){return m_value;}~Integer();
private:int m_value; // 实际的整型数字,提供一些十分方便操作的函数};
//Integer.cpp
//
// Created by 陈莹莹 on 2021/2/14.
//#include "Integer.h"
//调用默认构造时会为m_value赋一个默认值为0
Integer::Integer():m_value(0)
{//ctor
}
Integer Integer::operator+(Integer other)
{Integer result(this->m_value + other.m_value);  // 加法的结果,返回return result;
}
Integer::~Integer()
{//dtor
}

demo2:重载加法运算符2–()

    // 重载加号运算符2--对应的.cpp 需要改变// const Integer &operator+(const Integer & other) const;const Integer operator+(const Integer & other) const;// 第一个const 修饰返回值,返回值用引用更好(报错,不返回引用)// 第二个const 修饰参数,传递的是参数的引用,并且不希望改变参数// 第三个const 不修改当前的成员变量
//Integer.cpp
const Integer Integer::operator+(const Integer & other) const
{Integer result(this->m_value + other.m_value);  // 加法的结果,返回return result;
}

可以被重载的运算符包括所有的C的运算符,可以重载的运算符列表如下

二远运算符+,-,*,/,%
关系运算符==, !=, <, >, <=, >=
逻辑运算符
一元运算符+正, -负, *(指针), &(取地址), ++(自增), --(自减)
位运算符&,
赋值运算符=, +=, -=, *=, /=, %=, &=,
内存声明与释放new, delete, new[], delete[]
其他运算符()(函数), ->(成员访问), ->*(成员指针访问), ,(逗号), [](下标)

不能被重载的运算符

.点运算符
*成员指针访问运算符
::域运算符
sizeof长度运算符
?:三元运算符

预算符重载的注意点:
1.重载不能修改运算变量的个数
2.重载不能修改运算符的优先级别
3.重载不能修改运算顺序

(运算符重载先听一遍,之后需要的化买《Effective C++》(更高效的C++)再看)
在条款10:重载赋值运算符(复合赋值符号)的建议用法:返回*this。返回一个新建对象也可以,但是不够高效。
在条款11: 如果是自我赋值,就不要做任何事情。

2.友元函数–难点(流运算符重载)

Integer num1(1024), Integer num2(24);
Integer num3 = num1 + num2; // 正常执行
Integer num4 = 1024 + num1; // 编译错误。 因为int 类型中没有重载+ 号

使用友元函数,重载运算符时加一个friend关键字。 可以直接访问类的私有成员。
(仅摘录相关代码)
demo: 友元函数重载,+,流运运算符

//main.cppInteger int5;// int5 = int4 + 1024;    // 没有实现友元函数也能够运行的写法int5 = 1024 + int4;       // 加了友元函数才能过cout << "int5 = " << int5.Intvalue() << endl;// 重载流运算符--可以实现封装某个对象的打印格式cout << "重载了流运算符,可以直接打印对象" << int5 << endl;Integer int6;cin >> int6;cout << "输入的int6为:" << int6;
//Integer.h// 友元函数--friendfriend const Integer operator+(int intValue, const Integer & other);  // 最后不能加const会报错// 重载流运算符--一般只能使用友元的方式,返回值插入流,会变所以不用const 修饰返回值friend ostream & operator<<(ostream & out, const Integer & num);friend istream & operator>>(istream & in, Integer & num);
//Integer.cpp
// 友元函数不需要使用域运算符号
const Integer operator+(int intValue, const Integer & other){cout << "使用友元方式重载了+运算符,实现int类型和Integer类型的相加" << endl;return Integer(intValue + other.m_value);  // 返回了一个新的Integer对象
}
ostream & operator<<(ostream & out, const Integer & num){out << num.m_value;return out;
}
istream & operator>>(istream & in, Integer & num){cout << "请输入一个整数:" ;in >> num.m_value;return in;
}
运算符声明成类成员还是声明成独立友元函数的建议准则
必须声明为成员函数赋值预算符=、数组下标预算符[]、函数调用运算符()、成员访问运算符->
必须声明为友元函数流预算符>>、<<、类型转换运算符
一般声明为友元函数一元运算符、复合赋值运算符
一般声明为友元函数二元运算符

注意:

  1. 剩下的预算符可以友元也可以成员函数重载
  2. 必须选择一种方式,避免二义性,参数列表不同就是不同的两个重载
  3. 没有绝对的好坏,按上表建立来就可以。

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

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

相关文章

反应器组件 ACE_Reactor

6.1 反应器组件 ACE_Reactor反应器的基本原理是: 针对关心的某个事件写一个事件处理器(event_handler). 将该事件处理器登记到反应器中(同时指明关心的事件). 然后反应器会自动检测事件的发生. 并调用预先登记的事件处理器中的回调函数. 所以ACE Reactor 框架的责任&#x…

C++(17)--详解const

详解const《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------1.const修饰成员变量 2.const修饰函数参数 3.c…

cppcheck的安装和使用

首先从这里下载linux版本的:http://sourceforge.net/projects/cppcheck/files/cppcheck/ 然后下载对应的版本,解压,之后安装: 编译: g++ -o cppcheck -Ilib cli/*.cpp lib/*.cpp 安装: make install

leetcode24 两两交换链表中的节点

给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 思路&#xff1a;这一看就是个递归定义&…

再议指针和引用的一些事情吧

关于指针和引用一直是学习C++的同学们争论的焦点,什么时候用指针,什么时候用引用,还有怎么引用数组,这么用指针访问数组,以及初始化的问题。 不过有一些文章我在很早就已经写过,但是由于当时时间不充分,自己也都是随性写的,可以参看以前我的一个文章:http://blog.csd…

C++(18)--复制构造函数

复制构造函数《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------包装基本类&#xff0c;封装一些算法。 需求…

lua与C++粘合层框架

一. lua调用C 在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型: typedef int (*lua_CFunction) (lua_State *L);   也就是说, 偶们在C中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, 偶们的lua_State是…

leetcode147 对链表进行插入排序

丢人&#xff0c;我就是按插入排序老老实实写的啊。。。。 别人肯定map了hhh。 对链表进行插入排序。 插入排序的动画演示如上。从第一个元素开始&#xff0c;该链表可以被认为已经部分排序&#xff08;用黑色表示&#xff09;。 每次迭代时&#xff0c;从输入数据中移除一个…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 属于完全可见的信念网络&#xff0c;需要对 概率密度 建模。给定图像数据x&#xff0c;想要对概率分布p(x)建模。概率分布p(x)可以看做&#xff0c;每一像素分布同时作用结果的一个联合分布。一…

Expression : invalid operator 解决方法

从技术上说&#xff0c;用于排序关联容器的比较函数必须在它们所比较的对象上定义一个“严格的弱序化(strict weak ordering)”。&#xff08;传给sort等算法的比较函数也有同样的限制&#xff09;,就是两个对象比大小或先后的规则&#xff0c;比如两个 string对象比大小的规则…

leetcode23 合并K个排序链表

合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路&#xff1a;把初始的每一个链表当成数组中的一个数&#xff0c;做…

Xcode LaunchImage 载入界面大小设置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 删除链表中的节点(你意想不到的做法,注意细节)

请编写一个函数&#xff0c;使其可以删除某个链表中给定的&#xff08;非末尾&#xff09;节点&#xff0c;你将只被给定要求被删除的节点。 现有一个链表 -- head [4,5,1,9]&#xff0c;它可以表示为: 示例 1: 输入: head [4,5,1,9], node 5 输出: [4,1,9] 解释: 给定你链…

cppcheck值得注意的一些筛选项

使用完cppcheck进行C代码检测之后&#xff0c;可能筛选起来很麻烦&#xff0c;一般常见的优化有 emptiness&#xff0c;就是当你使用stl的时候&#xff0c;最好用empty替代size 还有就是 leak

C++(19)--自定义Array,vector练习

自定义Array,vector1.自定义Array2.自定义vector《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------1.自定义…

让cocos2dx支持并通过arm64 编译

为了要支持64位,请把这个文件直接替换到对应的lib目录下,本来是需要改neton_matrix_impl.c里的宏定义, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 为#if defined(_ARM_ARCH_7) 还有 third_party目录下的curl的支持。

springboot——概述

Spring Boot 介绍 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计⽬的是⽤来简化新 Spring 应⽤ 初始搭建以及开发过 程&#xff0c;该框架使⽤了特定的⽅式来进⾏配置&#xff0c;从⽽使开发⼈员不再需要定义样板化的配置。 默认配置了很多框架的使⽤⽅式…

C++(20)--类型自动转换

类型自动转换1.C内置类型转换2.实现自定义类的类型转换《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》 -------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)---------------…

关于遍历linux的文件目录的坑- readdir

去年给公司写了一个配置服务器,目的是解决运维的工作量太大,而且传送服务器需要的配置文件需要脚本传送到各个服(每个服ip不一样,需要scp),然后再刷新通知各个GameServer,中间有没有传送失败并不得知,而且维护相当麻烦,所以我写了这个服务器,所有区服的配置都在这里边…

终于,我读懂了所有Java集合——sort

Collections.sort 事实上Collections.sort方法底层就是调用的Arrays.sort方法&#xff0c;而Arrays.sort使用了两种排序方法&#xff0c;快速排序和优化的归并排序。 快速排序主要是对那些基本类型数据&#xff08;int,short,long等&#xff09;排序&#xff0c; 而归并排序用于…