C++运算符重载、迭代器、继承、派生类的构造与析构、重载、隐藏和覆盖

运算符重载

普通的C++运算符重载成员方法基本都知道,如果没有定义成员方法,那么编译器会优先寻找全局重载运算符看看是否匹配。这里给出了一个使用友元函数和全局重载运算符来实现整数与复数类对象的相加运算。

#include <iostream>

class Complex {
private:
    double real;
    double imaginary;

public:
    Complex(double real = 0.0, double imaginary = 0.0)
        : real(real), imaginary(imaginary) {}

    double getReal() const {
        return real;
    }

    double getImaginary() const {
        return imaginary;
    }

    // 声明友元函数,operator+可以访问传入的 complex的私有成员
    friend Complex operator+(int number, const Complex& complex);
};

// 定义友元函数,实现整数在前的加法运算
Complex operator+(int number, const Complex& complex) {
    double newReal = number + complex.real;
    return Complex(newReal, complex.imaginary);
}

int main() {
    Complex c1(2.0, 3.0);
    int number = 5;

    Complex result = number + c1;

    std::cout << "Result: " << result.getReal() << " + " << result.getImaginary() << "i" << std::endl;

    return 0;
}

值得注意的是:双目运算符一般要传两个参数,单目运算符看情况(可能需要传一个参数区分前目和后目)。加法运算符重载和输出运算符(<<)重载都需要两个参数,但它们的参数传递方式不同。对于加法运算符重载,将其定义为成员函数时,左操作数是隐式对象,而右操作数是显式参数。因此,在重载加法运算符时,我们只需要一个显式参数,该参数表示右操作数。对于输出运算符(<<)重载,将其定义为非成员函数时(一般也是如此,因为作为成员函数的时候,默认左操作数是隐式对象,也就是this指针),左操作数是一个输出流对象(std::ostream 类型),而右操作数是要输出的对象。因此,重载输出运算符时需要两个参数。

Iterator

Iterator也叫迭代器,它是一个类中类,更具体来说是容器类内的一个类,这个类有一个属性是指针,指向了容器类元素的地址。它可以提供一种统一的方式,来透明的遍历容器。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // 获取迭代器对象
    std::vector<int>::iterator it;

    // 使用迭代器遍历向量
    for (it = myVector.begin(); it != myVector.end(); ++it) {
        int element = *it;
        std::cout << element << std::endl;
    }

    return 0;
}                           

C++11中的foreach方式,本质上也是在用iterator。
                                       #include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";

    // 使用 foreach 循环遍历字符串并打印每个字符
    for (char c : str) {
        std::cout << c;
    }
    std::cout << std::endl;

    return 0;
} 

继承 

类和类之间的关系:1、组合,A part of。2、继承,a kind of。

继承的本质是代码的复用。

基类也叫父类,子类也叫派生类。            

基类与派生类的关系:

  1. 基类成员的访问权限,在派生类里面是不能超过继承方式的。 
  2. 外部只能访问对象的public成员,protected和private的成员无法直接访问。
  3. 在继承结构中,派生类从基类可以继承过来private成员,但是派生类无法直接访问。基类的私有成员对于派生类和外部都是不可见的。
  4. Protected和private继承的区别是在基类中定义的成员,想被派生类访问,但是不想被外部访问,那么在基类中,把相关成员定义成protected保护的;如果派生类和外部都不打算访问,那么在基类中把相关成员定义成private私有的。

默认的继承方式是什么?要看派生类是class定义的还是struct定义的。Class定义的派生类,默认继承方式是private,否则就是public。     

派生类的构造与析构过程

派生类从基类继承来所有的成员。

派生类从基类继承 过来的成员,初始化和清理由基类的构造和析构函数负责。 

派生类的构造函数和析构函数,负责初始化和清理派生类部分。   

构造的时候会先调用基类的构造函数,析构的时候则相反。

重载、隐藏、覆盖

重载关系:与i组函数要重载,必须要处在同一个作用域当中;而且函数名相同,参数列表不同。

隐藏关系:在继承结构当中,派生类如果有同名成员,把基类的同名成员给隐藏调用了,不管参数列表是否一致。隐藏掉的是作用域,优先找的是派生类自己作用域的show名字成员;没有的话,才去基类里面寻找。如果要调用被隐藏掉的基类成员,需要在函数名前面添加作用域。

一般来说派生类不仅包含了自己带的成员,还包含了基类成员。
所以派生类对象赋值给基类对象的时候,可以直接把基类部分的成员赋值给基类。
基类对象赋值给派生类对象的时候,则不被允许。
基类指针(引用)指向派生类对象的时候,只能访问基类部分的成员。
派生类指针(引用)指向基类对象的时候,则不被允许。有些编译器可能在语法上没问题,但这是不安全的,涉及了内存的非法访问。

覆盖
在C++中,当派生类继承自一个包含虚函数的基类时,派生类会复制基类的虚函数表,从而生成自己的虚函数表。如果派生类重写了虚函数,那么就会修改派生类虚函数表中的虚函数定义,这种关系就叫覆盖。后文再详细说明。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink双流(join)

一、介绍 Join大体分类只有两种&#xff1a;Window Join和Interval Join Window Join有可以根据Window的类型细分出3种&#xff1a;Tumbling(滚动) Window Join、Sliding(滑动) Window Join、Session(会话) Widnow Join。 &#x1f338;Window 类型的join都是利用window的机制…

蜂鸣器实验

1.有源蜂鸣器简介 蜂鸣器常用于计算机、打印机、报警器、电子玩具等电子产品中&#xff0c;常用的蜂鸣器有两种&#xff1a; 有源蜂鸣器和无源蜂鸣器&#xff0c;这里的有“源”不是电源&#xff0c;而是震荡源&#xff0c;有源蜂鸣器内部带有震荡 源&#xff0c;所以有源蜂…

OD(8)之Mermaid流程图(flowcharts)使用详解

OD(8)之Mermaid流程图(flowcharts)使用详解 Author: Once Day Date: 2024年2月20日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍…

Maven 私服 Nexus3

一、Maven和Nexus3 简介 Maven是一个采用纯Java编写的开源项目管理工具&#xff0c;采用一种被称之为Project Object Model(POM)概念来管理项目&#xff0c;所有的项目配置信息都被定义在一个叫做POM.xml的文件中, 通过该文件Maven可以管理项目的整个生命周期&#xff0c;包括…

maven 打包命令

Maven是基于项目对象模型(POM project object model)&#xff0c;可以通过一小段描述信息&#xff08;配置&#xff09;来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。 Maven的核心功能便是合理叙述项目间的依赖关系&#xff0c;通俗点讲&#xff0c;就是通过po…

06 分频器设计

分频器简介 实现分频一般有两种方法&#xff0c;一种方法是直接使用 PLL 进行分频&#xff0c;比如在 FPGA 或者 ASIC 设计中&#xff0c;都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性&#xff0c;无法得到频率很低的时钟信号&#xff0c;比如输入 …

Predis Multi-Zone

A Data Flow Framework with High Throughput and Low Latency for Permissioned Blockchains 联盟链的吞吐瓶颈由共识层和网络层的数据分发过程共同决定。 Predis 协议利用了共识节点的空闲带宽&#xff0c;提前分发区块中的内容即bundle&#xff0c;减少了共识区块中的内容&…

2024龙年特别篇 -- 魔法指针 之 assert断言 传址调用 传值调用

你是否为 assert断言&#xff0c;传址调用&#xff0c;传值调用而进一步加深印象&#xff0c;接下来就让白子寰同学为你详细讲解&#xff01;&#xff01;&#xff01; 目录 assert断言 概念 assert介绍 #define NDEBUG的使用 注意事项 传值调用 VS 传址调用 传值调用…

C语言推荐书籍

本书详细讲解了C语言的基本概念和编程技巧。全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章&#xff5e;第15章详细讲解了C语言的相关知识&#xff0c;包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串…

CS_Smb_Beacon上线不出网机器

当我们想上线不出网的机器的时候&#xff0c;我们可以通过上传工具来实现&#xff0c;但是有没有不用上传工具的方法呢&#xff1f;&#xff1f;&#xff1f; 有&#xff01;&#xff01;&#xff01; 而且cs会自带&#xff01;&#xff01;&#xff01; 1.基础的网络拓扑 以下…

MYSQL数据库详解

一、数据库的基本概念 数据&#xff08;data&#xff09;&#xff1a;指对客观事物进行描述并可以鉴别的符号。这些符号是可识别的&#xff0c;抽象的。 比如数字、图片、音频等。 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;数据库极其管理它的软件组成。 数据库…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列&#xff08;定时消息&#xff09;6.重试队列7.死信队列8.消息语…

2.21C语言学习

Floyd算法原理 Floyd算法是一个经典的动态规划算法&#xff0c;它又被称为插点法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。Floyd算法是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,算法目标是寻找…

工厂方法模式Factory Method

1.模式定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类 2.使用场景 1.当你不知道改使用对象的确切类型的时候 2.当你希望为库或框架提供扩展其内部组件的方法时 主要优点&#xff1a; 1.将具体产品和创建…

解决NPE的三种方式

解决NPE的三种方式 NullPointerException&#xff08;空指针异常&#xff0c;NPE&#xff09;是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑&#xff1a; 明确处理空引用情况&#xff1a; 在某些情况下&#xff0c;无法避免使用可能为空的引用对象。此时&…

【漏洞复现】H3C SecParh堡垒机任意用户登录漏洞

Nx01 产品简介 H3C SecParh堡垒机是一款专业用于安全管理的堡垒机产品&#xff0c;它通过强大的访问控制功能和安全审计功能&#xff0c;实现对网络服务器的远程安全管理和监控。 Nx02 漏洞描述 H3C SecParh堡垒机的get_detail_view.php中存在任意用户登录漏洞。攻击者可以构建…

计算机体系架构初步入门

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 1 计算机五大…

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))

好久不见&#xff0c;甚是想念&#xff0c;最近一直在看过河这道题&#xff08;感觉最近脑子有点宕机QAQ&#xff09;&#xff0c;现在算是有点懂了&#xff0c;打算记录下这道又爱又恨的题。&#xff08;如有错误欢迎大佬帮忙指出&#xff09; 话不多说&#xff0c;直接看题&…

2024三掌柜赠书活动第十一期:精通区块链开发技术(第2版)

目录 前言关于区块链开发技术关于《精通区块链开发技术(第2版)》编辑推荐内容简介作者简介图书目录书中前言/序言《精通区块链开发技术(第2版)》全书速览结束语 前言 作为开发者经常在技术圈活动&#xff0c;会接触各种前沿技术&#xff0c;比如区块链技术的崛起引发了全球范…

MySQL初识——安装配置

文章目录 1. MySQL卸载2. 获取MySQL官方yum源安装包3. 安装4. 启动MySQL5. 登录6. 配置配置文件 Tips&#xff1a; 本章是Centos 7安装配置myql&#xff0c;配置操作用的是root权限 1. MySQL卸载 首先我们先查看一下系统中是否有mysql服务 ps axj | grep mysql如果有&#xf…