(侯捷C++)1.2面向对象高级编程(上)

news2024/9/25 9:40:52

1.整体结构

 2.三大函数:拷贝构造,拷贝赋值,析构

  • 拷贝构造:第一次出现对象,使用拷贝构造进行创建,例如:String s3(s1)。
  • 拷贝赋值:对象已经构造,重新赋值,例如s3 = s2。
  • 编译器有默认拷贝构造,但是提供的是浅拷贝,当有指针时,一定要自己定义拷贝构造,使用默认拷贝会出现问题。
  • 拷贝构造写法:String(const String& str);拷贝赋值写法:String& operator=(const String& str)。
  • 有指针的类一定要自己写拷贝构造和拷贝赋值,实现深拷贝,避免造成内存泄漏。
  • 拷贝赋值函数示例:
inline String& String::operator=(const String& str) {
    //检测自我赋值
    if(this == &str) return *this;

    //将原来清空
    delete []m_data;

    //分配空间
    m_data = new char[strlen(str.m_data) + 1];

    //复制
    strcpy(m_data, str.m_data);
    return *this;
}

3.堆栈及内存管理

  • stack是存在于某作用于的一堆内存空间,当调用函数时,函数本身就会形成一个stack用来放置它所接收的参数以及返回值。
  • heap是由操作系统提供的一堆全局内存空间,用new的方式动态获得,与之匹配用delete释放。
  • new先分配空间,再调用构造函数,delete先调用析构函数,再释放空间。
  • array new一定要搭配array delete。

  • stack objects的生命在作用域结束之际结束,因为离开作用域时会被自动析构。
  • static objects其生命在作用域结束之后仍然存在,直到整个程序结束。
  • global objects其生命在整个程序结束之后才结束,可以将其视为static objects,其作用域为整个程序。
  • heap objects生命在被delete之际结束。

总结 -- String类的实现过程

  •  类声明
class String {
public:
    String(const char* cstr = 0); //有参构造
    String(const String& str); //拷贝构造
    String& opreator= (const String& str); //拷贝赋值
    ~String(); 
    char* get_c_str() const {return m_data}; //方便cout接收

private:
    char* m_data; //使用指针可以动态分配大小
};
  • 类实现
inline String::String(const char* cstr = 0) {
    if(cstr) {
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    }
    else { //未指定初值
        m_data = new char[1];
        *m_data = '\0';
    }
}

inline String::~String() {
    delete[] m_data;
}

inline String::String(const String& str) {
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.data);
}

//拷贝赋值
inline String& String::operator=(const String& str) {
    //检测自我赋值
    if(this == &str) return *this;

    //将原来清空
    delete []m_data;

    //分配空间
    m_data = new char[strlen(str.m_data) + 1];

    //复制
    strcpy(m_data, str.m_data);
    return *this;
}

4.扩展补充:类模板,函数模板及其他

(1)static补充:

  • 函数和数据均可以设为静态。
  • 静态数据要在类外进行定义。
  • 静态数据 / 函数只有一份,它不属于任何一个对象,被所有对象共享。
  • 静态函数只能处理静态数据,调用方式有两种:1.通过对象调用;2.通过类名调用。

代码示例:

 (2)将构造函数放在private的情况

  • 在单例模式下,将构造函数设为private,此时只允许创建唯一一个对象。
  • 单例模式设置静态函数,是外界获取对象的唯一窗口。

  •  进一步写法是将static A a写在getInstance中,如果没有人使用时a不会被创建。

(3)进一步补充类模板、函数模板

  • 类用法:template<typename T>后面跟class
  • 函数模板用法:template<typename T>后面跟函数

(4)进一步补充std

  • C++标准库中的对象和函数都是在std中定义的。

类与类之间的关系:组合 继承 委托

1.组合与继承

  • 组合表示has a,一个类拥有另一个类,container拥有component。
  • 其大小关系可以用下图来说明。

  •  构造顺序由内而外,Container的构造函数先调用Component的构造函数,然后才执行自己。
  • 析构函数由外而内,Container的析构函数先调用自己,然后调用Component的析构函数。
  • 组合关系的两个类的寿命一样。
  • 继承表示is a,一个类是另一个类中的一种,父类的数据会被完整的继承给子类。
  • 继承的语法为class A : public/private/protected class B。
  • 从结构上来看,子类的对象会包含着父类的成分。

  •  构造顺序由内而外,子类首先调用Base的构造函数,然后执行自己;析构顺序由外而内,子类的析构函数首先执行自己,然后调用Base的析构函数。

2.虚函数与多态

  • 非虚函数:不希望子类重新定义。
  • 虚函数:希望子类重新定义,并且它有默认定义。
  • 纯虚函数:希望子类一定要重新定义,对它没有默认定义。

3.委托相关设计

  • 一个类有另一个类,但只是有指向另一个类的指针,通过指针相连,可以称为Composition by reference。

  • 委托关系的两个类的寿命不一致,现有右边的类,才能有左边的类。
  • 当a、b、c都委托hello时,如果a想修改,需要重新复制一份给a用来修改,不能影响bc。
  • 常用于通过子类的对象调用父类的函数。

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

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

相关文章

人工智能辅助药物发现(4)药物重定位

目录药物重定位概述药物重定位数据库表示学习基于序列的表示学习基于图的表示学习药物重定位深度学习以靶点为中心以疾病为中心药物重定位的应用药物重定位概述 新药物的研发投资巨大&#xff0c;周期漫长。从获批准的临床药物中有效识别新的适应药物在药物发现中起到重要作用…

cc123 靶场测试笔记

1.cc123 靶场介绍本靶场存在四个 flag 把下载到的虚拟机环境导入到虚拟机&#xff0c;本靶场需要把网络环境配置好。1.1.网络示意图2. 信息收集2.1.主机发现sudo netdiscover -i eth0 -r 192.168.0.0/242.2.masscan 端口扫描sudo masscan -p 1-65535 192.168.1.102 --rate10002…

Elasticsearch7.8.0版本高级查询—— 高亮查询文档

目录一、初始化文档数据二、高亮查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; { "name":"zhangsan", "ag…

<Python的文件>——《Python》

目录 1.文件 1.1 文件是什么 1.2 文件路径 1.3 文件操作 1.3.1 打开文件 1.3.2 关闭文件 1.3.3 写文件 1.3.4 读文件 1.3.5 关于中文的处理 1.4 使用上下文管理器 1.文件 1.1 文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失.…

23种设计模式(十八)——组合模式【数据结构】

文章目录 意图什么时候使用组合真实世界类比组合模式的实现组合模式的优缺点亦称: 对象树、Object Tree、Composite 意图 有时又叫作整体-部分(Part-Whole)模式,是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致…

【并发编程】Executor线程池

一、线程 1.线程 线程是调度CPU资源的最小单位。java线程与OS线程保持1:1映射关系&#xff0c;也就是说&#xff0c;一个Java线程也会在操作系统里有一个对应线程。 2.线程的生命周期 NEW,新建 RUNNABLE,运行 BLOCKED,阻塞 WAITING,等待 TIMED_WAITING,超时等待 TERMINATED…

超级完整的 Git 下载、安装与配置

Git的下载、安装与配置 一、git下载安装 1、访问git官方下载网址&#xff0c;点击这里&#xff0c;然后根据自己的电脑系统&#xff0c;下载对应的安装包&#xff1a; 2、在淘宝镜像网站 下载对应的安装包&#xff1a; 注&#xff1a; 如果由于官网下载速度过于缓慢&#xff…

String 有趣简单的编程题

String 有趣简单的编程题 每博一文案 师父说: 世上没有真正的感同身受&#xff0c;也没有谁能完全做到将心比心&#xff0c;我们一路走来。 慢慢的学会了收敛情绪&#xff0c;越成熟越沉默&#xff0c;有些人&#xff0c;背负沉重的压力&#xff0c;却从来不敢说累&#xff0c…

[python刷题模板] 树的直径/换根DP

[python刷题模板] 树的直径/换根DP 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码1. 单纯询问树的直径值2. 求出树的直径两端搞事情3. 换根DP求树的直径(大炮打蚊子&#xff0c;别这么做&#xff0c;只是用来帮助理解换根DP)4. 换根dp求特定…

UDS诊断系列介绍14-2F服务

本文框架1. 系列介绍1.1 2F服务概述2. 2F服务请求与应答2.1 2F服务请求2.2 2F服务正响应2.3 2F服务否定响应3. 2F诊断使用示例4. Autosar系列文章快速链接1. 系列介绍 UDS&#xff08;Unified Diagnostic Services&#xff09;协议&#xff0c;即统一的诊断服务&#xff0c;是…

学习记录667@项目管理之项目人力资源管理

什么是项目人力资源管理 项目人力资源管理包括编制人力资源管理计划、组建项目团队、建设项目团队与管理项目团队的各个过程&#xff0c;不但要求充分发挥参与项目的个人的作用&#xff0c;还包括充分发挥所有与项目有关的人员-----项目负责人、客户、为项目做出贡献的个人及其…

[QMT]04-在QMT之外调用xtquant直接编写策略

背景希望不用在QMT软件里面憋屈地写代码&#xff0c;想使用pychar、vscode、notepad等IDE编写python代码&#xff0c;因为有代码提示、补全。这完全没问题&#xff01;QMT简直是为个人量化交易者量身打造的神器&#xff0c;它支持以上想法。QMT这个东东基本是由两部分组成的&am…

1. 深度学习简介|计算机视觉简介|得分函数|损失函数作用|前向传播整体流程

文章目录深度学习简介计算机视觉简介k近邻算法得分函数损失函数作用前向传播整体流程机器学习是一个大块&#xff0c;其中就包含着深度学习&#xff0c;计算机视觉等 机器学习的流程&#xff1a; 数据获取特征工程建立模型评估与应用 深度学习简介 深度学习通过特征学习进行…

力扣sql简单篇练习(四)

力扣sql简单篇练习(四) 1 超过五名学生的课 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT class FROM Courses GROUP BY class HAVING count(student)>51.3 运行截图 2 超过经理收入的员工 2.1 题目内容 2.1.1 基本题目信息 2.1.2 示例…

零信任-发展历程及概念(1)

零信任发展历程 2010 Forrester约翰金德维格正式提出零信任概念 2013 CSA成立软件定义边界SDP工作组,次年发布SDP标准规范1.0 2017 Gartner正式提出“CARTA”零信任模型 2018 Forrester发表零信任扩展模型ZTX 2019 Gartner发布零信任网络&#xff08;ZTNA&#xff09;云安…

String 与 StringBuffer 与 StringBuilder 各自的妙用

String 与 StringBuffer 与 StringBuilder 各自的妙用 每博一文案 我从未见过&#xff0c;一个早起&#xff0c;勤奋&#xff0c;谨慎&#xff0c;诚实的人&#xff0c;抱怨命运不好的。 最完美的状态&#xff0c;不是你从不失误&#xff0c;而是你从没放弃成长。没人能把你变…

【SpringMVC】看完这篇简单理解并入门SpringMVC:通过入门案例举例子的方式快速理解

SpringMVC简介1.什么是MVC2.什么是SpringMVC3.SpringMVC的特点4.入门案例1.准备工作2.配置web.xml3.创建请求控制器4.创建SpringMVC的配置文件5.测试HelloWorld6.总结1.什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&…

【Java】比较器 Comparator Comparable

一、背景 我们在使用 Collections.sort() 对链表进行排序&#xff08;或者使用 Arrays.sort() 对数组进行排序&#xff09;时&#xff0c;常常需要根据不同情况自定义排序规则。比如&#xff1a;当我们存储学生对象时&#xff0c;我们需要按照学生年龄进行排序&#xff0c;这时…

树状数组(Binary Indexed Tree (B.I.T))

树状数组 树状数组 (Binary Indexed Tree(B.I.T), Fenwick Tree) 是一个查询和修改复杂度都为 log(n) 的数据结构。 「前缀和查询」与「单点更新」 直接前驱&#xff1a;c[i] 的直接前驱为 c[i - lowbid(i)]&#xff0c;即 c[i] 左侧紧邻的子树的根。 直接后继&#xff1a;c[i…

财务精度:BigInteger 与 BigDecimal

财务精度&#xff1a;BigInteger 与 BigDecimal 每博一文案 师父说: 人这一辈子&#xff0c;真地好难。 有些人&#xff0c;好着好着&#xff0c;忽然就变陌生了&#xff0c;有些手&#xff0c;牵着牵着&#xff0c;瞬间就放开了&#xff0c;有些路&#xff0c;走着走着&#…