C++ Primer Plus第十二章笔记

目录

动态内存和类

静态类成员

特殊成员函数

在构造函数中使用new时的注意事项

返回对象的问题

使用指向对象的指针

动态内存和类

C++中使用 new 和 delete 运算符来动态控制内存,析构函数不可缺少,否则会导致很多新的编程问题的出现。有时必须重载赋值运算符,从而保证程序正常运行。

静态类成员

静态类成员的特点:无论创建多少个对象,程序都只创建一个静态类变量副本(类的所有对象共享同一个静态成员)。

不能在类声明中初始化静态成员变量(声明描述了如何分配内存,但不分配内存)。可以在类声明之外单独使用单独语句来进行初始化(静态成员变量是单独存储,而不属于对象的组成部分)。

⚠️注意:静态数据成员在类声明中声明,在包含类方法的文件中的初始化。初始化时使用作用域运算符来指出静态成员所属的类。但如果静态成员整型枚举型const,则可以在类声明中初始化

⚠️警告:在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放内存。如果使用 new[] (包括中括号)分配内存,则应使用delete[](包括中括号)释放内存

自动存储对象被删除的顺序与创建顺序相反。

静态成员函数的声明中必须包含关键字 static,但如果函数定义是独立的,则其中不能包含关键字static。原因有二:

  • 不能通过对象调用静态成员函数,甚至不能使用this指针。
  • 静态成员函数不与特定的对象相关联,只能使用静态数据成员。

特殊成员函数

C++提供的隐式成员函数:

  • 默认构造函数,如果没有定义构造函数

    如果没有提供任何构造函数,C++将创建默认构造函数。

    StringBad::StringBad() {} // 隐式默认构造函数

    编译器将提供一个不接受任何参数、也不执行如何操作的构造函数(默认的默认构造函数)。

  • 默认析构函数,如果没有定义

  • 复制构造函数,如果没有定义

    • 定义

      复制构造函数用于将一个对象复制到新创建的对象中。用于初始化过程中(包括按值传递),而不是常规的赋值过程。类的复制构造函数的原型如下:

      Class_name(const Class_name &); //接收一个指向对象的常量引用作为参数
    • 何时调用?

      每当程序生成对象副本时,编译器都会使用复制构造函数。常见的情况:

      • 当函数按值传递对象时
      • 当函数返回对象时
      • 当编译器生成临时对象时
    • 默认的复制构造函数的功能

      默认的复制构造函数逐个复制非静态成员(成员复制,也称为浅拷贝),复制的是成员的值

      ⚠️警告:如果类中包含了使用new初始化的指针成员,应当定义一个拷贝构造函数,以复制指向的数据,而不是指针。这种称为深拷贝。浅拷贝只拷贝指针值(拷贝指针信息)

  • 赋值运算符,如果没有定义

    • 定义和原型函数

      C++允许类对象赋值,通过自动为类重载复制运算符来实现。函数原型如下:

      Class_name & Class_name::operator=(const Class_name &);
    • 赋值运算符的作用

      解决默认赋值运算符不合适导致的问题。

    • 实现复制运算符(进行深拷贝)的注意点:

      • 目标对象可能引用以前分配的数据,所以函数应使用 delete[] 来释放数据。
      • 函数应当避免将对象赋值给自身:否则给对象重新赋值时,释放内存操作可能删除对象的内存。
      • 函数返回一个指向调用对象的引用。
  • 地址运算符,如果没有定义

当使用一个对象来初始化另一个对象时,编译器将自动生成复制构造函数(创建对象的一个副本)。例如:

StringBad(const StringBad &)

在构造函数中使用new时的注意事项

使用new初始化对象的指针成员时必须小心。具体做法如下:

  • 如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete
  • new 和 delete必须相互兼容。new对应于deletenew[] 对应于 delete[]
  • 如果有多个构造函数,则必须以相同的方式使用 new,要么带括号,要么都不带。
  • 定义一个拷贝构造函数,通过深拷贝将一个对象初始化为另一个对象。

返回对象的问题

当成员函数或独立的函数返回对象时,有3种返回方式

  • 指向对象的引用

  • 指向对象的const引用

  • const对象

使用指向对象的指针

使用对象指针时的注意事项

  • 使用常规表示法来声明指向对象的指针。
  • 将指针初始化为指向已有的对象。
  • 可使用 new 来初始化指针,创建一个新的对象。
  • 对类使用 new 将调用相应的类构造函数来初始化新创建的对象。
  • 可使用 -> 运算符通过指针访问类方法。
  • 可对对象指针应用解除引用运算符来获得对象。

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

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

相关文章

Mybatis 的简单运用介绍

Mybatis 用于操作数据库 操作数据库肯定需要: 1.SQL语句 2.数据库对象和 java 对象的映射 接下来我们看看怎么使用 Mybatis 我们先搞一些数据库内容 然后将其这些内容和Java对象进行映射 再创建一个类实现 select * from 再写一个类证明上述代码是否可以实现 别忘了在appli…

unity学习笔记13

一、常用物理关节 Unity中的物理关节(Physics Joints)是用于在游戏中模拟和控制物体之间的连接。物理关节允许你在对象之间应用各种约束,例如旋转、移动或固定连接,以模拟真实世界中的物理交互。 物理关节类型: 1.F…

C 语言-数组

1. 数组 1.1 引入 需求:记录班级10个学员的成绩 需要定义10个变量存在的问题:变量名起名困难变量管理困难需求:记录班级1000个学员的成绩 1.2 概念 作用:容纳 数据类型相同 的多个数据的容器 。 特点: 长度不可变容纳 数据类型…

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探…

数据之美:数据可视化的力量与必要性

在当今信息爆炸的时代,数据量呈指数级增长,它们是我们日常生活和工作中的重要组成部分。然而,数据本身是无生命的数字和统计,若不能有效地被理解、传达和利用,其潜力就难以实现。这正是数据可视化变得越来越重要的原因…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨,伙计!刷到这篇文章咱们就是有缘人,在阅读这篇文章前我有一些建议: 本篇文章大概3000多字,预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强,是一篇质量分数较高的技术干货文章&#x…

java基础面试题(二)

java后端面试题大全 3.JVM3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置?3.2 java类的加载流程3.3 java内存溢出什么时候会发生以及解决方法 3.JVM 3.1 对象实例、类信息、常量、静态变量分别在运行时数据区的哪个位置? 堆 对象实例、String常量池、基…

基于gitlab的webhook集成jenkins,并在gitlab流水线中展示jenkins的job状态信息

文章目录 1. 环境信息2. gitlab 部署3. jenkins部署4. gitlab集成jenkins4.1 jenkins的凭据上保存gitlab的账号信息4.2 jenkins中配置gitlab的连接信息4.3 编写jenkins上pipeline文件4.4 jenkins上创建pipeline项目4.5 gitlab上配置webhooks事件4.6 测试 1. 环境信息 gitlab服…

LangChain 16 通过Memory记住历史对话的内容

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

Windows系列:windows2003-建立域

windows2003-建立域 Active Directory建立DNS建立域查看日志xp 加入域 Active Directory 活动目录是一个包括文件、打印机、应用程序、服务器、域、用户账户等对象的数据库。 常见概念:对象、属性、容器 域组件(Domain Component,DC&#x…

snat与dnat

一.SNAT的原理介绍 1.应用环境 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) 2.SNAT原理 源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢 数据包从内网发送到公网时&#xf…

Loki安装部署

Loki安装部署 1、Loki介绍 Loki 是受 Prometheus 启发由 Grafana Labs 团队开源的水平可扩展,高度可用的多租户日志聚合系统。开发语 言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索&…

Mongodb使用killOp停止正在执行的操作

与关系型数据库类似, mongodb在执行查询语句,修改数据,建立索引的操作过程中,会占用大量的cpu,内存的资源。mongodb提供了各种各样的监控工具和命令,监控数据库状态和运行效率。当用户提交的查询语句影响数…

<avue-crud/>,二级表头,children下字典项的dicUrl失效问题

目录 1.提出问题&#xff1a; 1.1 代码&#xff1a; 1.2 效果图&#xff1a;会发现处在children下的dicUrl失效了 2. 解决思路 3. 解决代码&#xff08;你要的都在这&#xff0c;看这里&#xff09; 1.提出问题&#xff1a; 在使用<avue-crud/>组件实现二级表头时&…

C++中异常的栈展开概念

C中的异常栈展开是指&#xff0c;当某个函数中有异常产生&#xff08;这里不考虑是主动抛出的还是被动产生的&#xff09;&#xff0c;在异常被捕获之前的函数调用链上&#xff0c;函数不会正常执行返回&#xff0c;即异常产生之后的程序逻辑不会被执行。 &#xff08;注意&…

Kafka的存储机制和可靠性

文章目录 前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储 五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5.1.…

建堆的时间复杂度和堆排序

文章目录 建堆的时间复杂度向下调整建堆向上调整建堆 堆排序实现 建堆的时间复杂度 下面都以建大堆演示 向下调整建堆 void Adjustdown(HPDataType* a, int size,int parent) {int child parent * 2 1;while (child < size){if (child1<size&&a[child 1] &…

Pandas进阶:transform 数据转换的常用技巧

引言 本次给大家介绍一个功能超强的数据处理函数transform&#xff0c;相信很多朋友也用过&#xff0c;这里再次进行详细分享下。 transform有4个比较常用的功能&#xff0c;总结如下&#xff1a; 转换数值 合并分组结果 过滤数据 结合分组处理缺失值 一. 转换数值 pd.…

Perplexity 推出全新大型在线语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

贪心算法的介绍

贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解&#…