当前位置: 首页 > news >正文

C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】

前言

总结整理不易,希望大家点赞收藏。

给大家整理了一下C++程序设计中的重点概念,以供大家期末复习和考研复习的时候使用。


C++程序设计系列文章传送门:
第一章 面向对象基础
第四/五章 函数和类和对象
第六/七/八章 运算符重载/包含与继承/虚函数和多态性
第九/十一/十二章 模板/输入/输出流/标准模板库
C++程序设计-练手题集合


文章目录

  • 前言
  • 第四章 函数 函数和类和对象
    • 4.1 说明带参数的宏与内联函数有什么不同
    • 4.2 全局变量和局部变量有什么区别是怎么实现的操作系统和编译器是怎么知道?
  • 第五章 类和对象
    • 5.1 C中的Class和C++的 struct有什么区别
    • 5.2 数组与链表有什么区别各有什么优缺点
    • 5.3 简述成员函数全局函数和友元函数这些概念的异同
    • 5.4 完整举例const限定符的作用,跟C语言的const有什么区别
    • 5.5 完整举例static关键字的作用,跟C语言Java中的static有什么区别?
    • 5.6 构造函数是否有返回值类型?
    • 5.7 什么是拷贝构造函数?在什么情况下被调用?
    • 5.8 什么是深拷贝?什么是浅拷贝?他们有什么区别?
    • 5.9 头文件中的infdef/deifine/endif有什么区别?
    • 5.10 什么时候友元是有用的?说明使用友元的优缺点
  • 6 练手题
  • 下一章传送门


不重要的章节我们直接跳过,因此直接从第一章跳到第四章

第四章 函数 函数和类和对象

4.1 说明带参数的宏与内联函数有什么不同

1、编译器处理方式不同:带参数的宏是在预处理阶段进行处理,它会将所有使用该宏的地方直接替换成宏定义中的代码,并且没有任何类型检查和错误检查。而内联函数是在编译阶段进行处理,编译器会将内联函数的代码插入到函数调用的地方,可以进行类型检查和错误检查。
2、参数求值次数不同:带参数的宏在被调用时,宏定义中的代码会被简单地文本替换,因此宏参数的求值次数可能比较多,这可能会导致不符合预期的行为。而内联函数在被调用时,参数的求值次数与普通函数相同。
3、代码生成方式不同:带参数的宏在被处理时,每次都会生成新的代码,这可能会导致生成的代码量较大。而内联函数在编译时被处理成了一份代码,可以被多次使用,这有助于减小代码量,提高代码的可读性和可维护性。
4、调试方式不同:带参数的宏在调试时可能会产生困难,因为调试器看到的是宏定义中的代码,而不是调用宏时的代码。而内联函数则可以通过调试器进行单步调试,从而更容易地进行调试。

4.2 全局变量和局部变量有什么区别是怎么实现的操作系统和编译器是怎么知道?

操作系统和编译器通过符号表(symbol table)来识别和管理变量。
1、作用域不同:全局变量在整个程序中都可以访问,而局部变量只在它所在的代码块可以访问。
2、存储位置不同:全局变量存储在程序的数据段中,而局部变量通常存储在栈或寄存器中。
3、生命周期不同:全局变量的生命周期与程序的运行时间一致,而局部变量的生命周期只存在于其所在的代码块中,在离开该代码块时会被销毁。

第五章 类和对象

5.1 C中的Class和C++的 struct有什么区别

默认访问权限:在 C++ 中,class 的默认访问权限是私有的,而 struct 的默认访问权限是公有的。
继承:class 支持私有继承、公有继承和保护继承,而 struct 只支持公有和保护继承。
模板参数限制:class 作为模板参数时可以是任何类型,而 struct 只能作为模板参数用于构建类型。这是因为 Class 可以包含成员函数和成员类型,而 struct 只能包含成员变量和成员类型。

5.2 数组与链表有什么区别各有什么优缺点

内存分配方式:数组在内存中是连续的一段空间,而链表中的节点可以存储在任意位置,通过指针链接。
访问元素的方式:数组可以通过下标直接访问元素。而链表需要从头节点开始顺序遍历。
插入和删除元素的效率:数组在插入和删除元素时需要移动其他元素,时间复杂度为O(n)。而链表在插入和删除元素时只需要修改指针,时间复杂度为O(1)。
优缺点:数组的优点是访问元素快速,而链表的优点是插入和删除元素快速。在需要频繁访问元素但不需要频繁插入和删除元素时,数组是一个更好的选择。而在需要频繁插入和删除元素但不需要频繁访问元素时,链表是更好的选择。此外,链表可以支持动态分配内存,而数组在声明时需要确定大小。

5.3 简述成员函数全局函数和友元函数这些概念的异同

成员函数是一个属于类的函数,它可以访问类的私有成员变量和保护成员变量。成员函数可以被类的对象调用,并且可以重载。
全局函数是一个在任何类或命名空间之外定义的函数。全局函数不属于任何类,不能访问类的私有成员变量和保护成员变量。全局函数也可以重载。
友元函数是一个定义在类外部但是有权访问类私有成员的非成员函数。友元函数必须在类定义中进行声明,并且可以访问类的所有私有成员变量和保护成员变量。友元函数也可以重载。
异同点:
定义位置:成员函数定义在类的内部,全局函数和友元函数定义在类的外部。
访问权限:成员函数可以访问类的私有成员变量和保护成员变量,而全局函数和友元函数不能访问类的私有成员变量和保护成员变量。
调用方式:成员函数必须通过类的对象调用,而全局函数和友元函数可以直接调用或通过对象调用。
重载:成员函数、全局函数和友元函数都可以重载。
归属关系:成员函数属于类,而全局函数和友元函数不属于任何类。
作用范围:成员函数的作用范围限定于类的对象,而全局函数和友元函数的作用范围不受限制。

5.4 完整举例const限定符的作用,跟C语言的const有什么区别

在C语言中,用const修饰的变量,其本质上还是个变量,可以通过指针来修改该变量的值。在C++中 ,在编译的时候,当碰到用const修饰的变量时,编译器是直接将变量的值和变量的符号对应起来一起存到符号表中。不会为const变量分配空间。在编译的时候如果前面有extern和取地址符 & 时,会为变量分配存储空间是为了兼容C语言

5.5 完整举例static关键字的作用,跟C语言Java中的static有什么区别?

在C语言中,static关键字可以用于函数和变量,用于函数时表示该函数只能在当前文件中被调用,用于变量时表示该变量只能在当前文件中被访问。在C++中,static关键字可以用于类的成员变量和成员函数,用于成员变量时表示该变量是类的静态成员,所有对象共享该变量,用于成员函数时表示该函数是类的静态成员函数,可以直接通过类名调用。

5.6 构造函数是否有返回值类型?

构造函数没有返回值类型。

5.7 什么是拷贝构造函数?在什么情况下被调用?

拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(const X & x)。
调用情况:
1、当用类的一个对象去初始化该类的另一个对象的时候。
2、如果函数的形参是类的对象,调用此函数的时候,进行形参和实参相结合时,拷贝构造函数被调用。
3、如果函数的返回值是类的一个对象,函数执行完成返回调用者时,会建立一个匿名对象,在对匿名对象进行拷贝构造。

5.8 什么是深拷贝?什么是浅拷贝?他们有什么区别?

浅拷贝:当编写一个类时,并且没有添加拷贝构造,此时系统会默认添加一个拷贝构造(浅拷贝)。浅拷贝是指:创建一个新对象时,把对象的初始属性都复制一份,若是存在引用类型,则拷贝的是其内存地址,当它的值发生改变时,另一个的值也会受到改变。若存在析构函数,可能会出现析构多次的情况。
深拷贝:深拷贝就是将对象从内存中完全拷贝出来,并且重新开辟一片空间来进行存放,当其中一个值发生改变时并不会影响另一个的值,两者互不影响。

5.9 头文件中的infdef/deifine/endif有什么区别?

当多个文件中同时包含相同的头文件,将头文件放到#ifndef/#deifne#endif中防止大量冲突。#ifndef <标识> #define <标识> … … #endif

5.10 什么时候友元是有用的?说明使用友元的优缺点

友元是一种定义在类外部的普通函数,但它需要在类体内进行声明,为了与该类的成员函数加以区别,在声明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。
friend ostream& operator<<(ostream& _cout, const Date& d);
友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

6 练手题

在这里插入图片描述

下一章传送门

第六/七/八章 运算符重载/包含与继承/虚函数和多态性

相关文章:

C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 C程序设计系列文章传送门&#xff1a; 第一章 面向对象基础 第四/五章 函数和类和对象 第六/七/八章 运算符重载/包含与继承/虚函…...

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…...

UnityShader常用算法笔记(颜色叠加混合、RGB-HSV-HSL的转换、重映射、UV序列帧动画采样等,持续更新中)

一.颜色叠加混合 1.Blend混合 // 正常&#xff0c;透明度混合 Normal Blend SrcAlpha OneMinusSrcAlpha //柔和叠加 Soft Additive Blend OneMinusDstColor One //正片叠底 相乘 Multiply Blend DstColor Zero //两倍叠加 相加 2x Multiply Blend DstColor SrcColor //变暗…...

Vue3调用钉钉api,内嵌H5微应用单点登录对接

钉钉内嵌H5微应用单点登录对接 https://open.dingtalk.com/document/isvapp/obtain-the-userid-of-a-user-by-using-the-log-free 前端需要的代码 1、安装 dingtalk-jsapi npm install dingtalk-jsapi2、在所需页面引入 import * as dd from dingtalk-jsapi; // 引入钉钉a…...

UE5 局域网联机,寻找会话失败。

目录 参考资料&#xff1a; 尝试解决办法 1.1在【项目名.Build.cs】脚本中添加该行&#xff0c;添加后关闭编辑器&#xff0c;重新生成解决方案。​编辑 2.检查是否在同一个C类子网 参考资料&#xff1a; 1.Cant find session in LAN - Programming & Scripting / Mul…...

Windows系统安装MongoDB并结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…...

Hadoop伪分布式配置--没有DataNode或NameNode

一、原因分析 重复格式化NameNode 二、解决方法 1、输入格式化NameNode命令&#xff0c;找到data和name存放位置 ./bin/hdfs namenode -format 2、删除data或name&#xff08;没有哪个删哪个&#xff09; sudo rm -rf data 3、重新格式化NameNode 4、重新启动即可。...

柚见第十期(后端队伍接口详细设计)

创建队伍 用户可以 创建 一个队伍&#xff0c;设置队伍的人数、队伍名称&#xff08;标题&#xff09;、描述、超时时间 P0 队长、剩余的人数 聊天&#xff1f; 公开 或 private 或加密 信息流中不展示已过期的队伍 请求参数是否为空&#xff1f;是否登录&#xff0c;未登录不…...

【李沐论文精读】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…...

新版Android Studio火烈鸟 在新建项目工程时 无法选java的语言模板解决方法

前言 最近下载最新版androidstudio时 发现不能勾选java语言模板了 如果快速点击下一步 新建项目 默认是kotlin语言模板 这可能和google主推kt语言有关 勾选1 如图所示 如果勾选 No Activity 这个模板 是可以选java语言模板的 但是里面没有默认的Activity 勾选2 和以前的用法…...

github(不是git啊)操作记录(踩坑)

专栏介绍与文章目录-CSDN博客 github是程序员绕不开的东西。 网站打不开&#xff1f; 向雇主或有关部门申请合法信道连接互联网。 明明账号密码都对却登录失败&#xff1f; 向雇主或有关部门申请合法信道连接互联网。 重置密码失败&#xff1f; 向雇主或有关部门申请合法信道…...

【SpringCloud微服务实战01】Eureka 注册中心

前言 在 Eureka 架构中&#xff0c;微服务角色有两类&#xff1a; EurekaServer &#xff1a;服务端&#xff0c;注册中心 记录服务信息 心跳监控 EurekaClient &#xff1a;客户端 Provider &#xff1a;服务提供者&#xff0c;例如案例中的 user-service …...

Python之函数进阶-柯里化

Python之函数进阶-柯里化 柯里化是一种将多参数函数转化为单参数高阶函数的技术。 具体来说&#xff0c;柯里化过程会将一个接受多个参数的函数&#xff0c;转换成一系列接受一个参数的函数&#xff0c;这些函数在内部组合起来&#xff0c;最终完成原函数的运算。 柯里化是一…...

Spring Cloud项目整合Sentinel及简单使用

说明&#xff1a;Sentinel是阿里巴巴开发的微服务治理中间件&#xff0c;可用于微服之间请求的流量管控、权限控制、熔断降级等场景。本文介绍如何在Spring Cloud项目中整合Sentinel&#xff0c;以及Sentinel的简单使用。 环境 首先搭建一个简单的微服务环境&#xff0c;有以…...

【话题】人工智能迷惑行为大赏

随着ChatGPT热度的攀升&#xff0c;越来越多的公司也相继推出了自己的AI大模型&#xff0c;如文心一言、通义千问等。各大应用也开始内置AI玩法&#xff0c;如抖音的AI特效&#xff5e;在使用过程中往往会遇到一些问题&#xff0c;让你不得不怀疑&#xff0c;这真的是人工智能吗…...

Jsp在Javaweb中扮演什么角色?

1.什么是Jsp JSP&#xff08;Java Server Pages&#xff0c;Java 服务器页面&#xff09;是一种动态网页技术&#xff0c;它允许在 HTML 页面中嵌入 Java 代码&#xff0c;并由 Web 服务器在请求页面时动态生成 HTML 页面。JSP 通常用于创建动态 Web 内容&#xff0c;如交互式表…...

部署docker仓库harbor

1、下载包 1、包已上传有两个harbor.v2.6.0.tar与harbor.tar 2、harbor.tar解压后会生成harbor目录&#xff0c;将harbor.v2.6.0.tar移动到harbor目录下。 3、执行harbor目录下的install.sh 4、执行完后修改配置文件 2、修改配置文件 vim /root/harbor/make/ harbor.yml.tmpl …...

Linux CentOS系统安装Spug并结合内网穿透实现远程访问本地运维平台

目录 前言 1. Docker安装Spug 2 . 本地访问测试 3. Linux 安装cpolar 4. 配置Spug公网访问地址 5. 公网远程访问Spug管理界面 6. 固定Spug公网地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux CentOS系统安装Spug并结合…...

阿里云第一次面试记录

java多态&#xff1f; 多态表示一个对象具有多种的状态&#xff0c;具体表现为父类的引用指向子类的实例 Fu f Zi z(); 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作 特点&#xff1a; 对象类型和引用类型…...

AndroidStudio跑马灯实现

在activity_main.xml中编写如下代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...