C++经典面试题目(二)

1. C++中,static关键字有什么作用?

在C++中,static关键字有多种作用,包括限定作用域、保持变量内容持久化和修饰类成员等。以下是static关键字在C++中的主要作用:

  1. 限定作用域:当变量、函数或类成员被声明为static时,它们的作用域会被限制在声明它们的文件、函数或类内部。对于局部变量,static关键字会使其生命周期延长至整个程序运行期间,但作用域仍然局限于定义它的函数内部。对于全局变量或函数,static关键字则将其作用域限制在定义它们的文件内部,实现了隐藏的作用。
  2. 保持变量内容持久化:static变量在程序执行期间只会被初始化一次,且其值在函数调用之间保持不变。这使得static变量可以用于保存程序执行过程中的状态信息。
  3. 修饰类成员:在类中,static关键字可以用于修饰成员变量和成员函数。静态成员变量属于类而不是类的对象,因此所有对象共享同一个静态成员变量。静态成员函数也只能访问静态成员变量或其他静态成员函数,不能访问类的非静态成员。此外,静态成员函数可以在没有创建对象的情况下通过类名直接调用。
  4. 优化程序性能:static关键字还可以用于形成静态代码块以优化程序性能。静态代码块在类初次被加载时执行一次,常用于初始化静态成员变量或执行只需进行一次的操作。

需要注意的是,虽然static关键字具有多种作用,但应根据具体需求和场景来选择使用。过度或不当地使用static关键字可能会导致代码结构混乱、难以维护或引发潜在问题。

2. C++中,#define和const有什么区别?

在C++中,#defineconst都可以用来定义常量,但它们之间存在一些关键的区别。

  1. 定义与含义:

    • #define是C++预处理器的指令,用于定义宏。它实际上并不属于C++语言本身的一部分,而是在编译前的预处理阶段进行处理的。#define不仅可以定义常量,还可以定义函数、对象、类型等宏。
    • const是C++关键字,用于定义常量。它定义的是一个具有常量性质的变量,其值在程序运行期间不能被修改。const定义的常量具有类型,并且编译器会进行类型安全检查。
  2. 作用对象与类型检查:

    • #define定义的宏没有类型,仅仅是简单的文本替换。预处理器在编译前将程序中所有的宏替换为相应的文本,而不会进行类型检查。因此,使用#define定义的常量在编译时不会分配内存空间,也不会有存储与读内存的操作。
    • const定义的常量具有具体的类型,并且编译器会在编译阶段进行类型检查。这意味着如果你试图修改一个const常量的值,编译器会报错。此外,const常量会在内存中分配空间(可以是堆中也可以是栈中),尽管对于编译期间的常量,编译器通常会将它们保存在符号表中以提高效率。
  3. 编译器处理方式:

    • #define宏是在预处理阶段展开的,因此不能在调试阶段对宏定义进行调试。此外,由于宏只是简单的文本替换,所以在使用时需要特别小心宏展开后可能产生的副作用(如运算符优先级问题、多次展开等)。
    • const常量是在编译阶段进行处理的,因此可以在调试阶段对其进行调试。由于const常量具有类型并且编译器会进行类型检查,所以使用起来相对更安全。
  4. 存储方式与效率:

    • 如前所述,#define宏仅仅是文本替换,不会分配内存空间。这使得它在某些情况下可以节省空间,但也可能导致代码膨胀(因为宏展开可能会产生大量的重复代码)。
    • const常量会在内存中分配空间,但编译器通常会进行优化以减少不必要的内存分配。例如,对于编译期间的常量(即编译时已知其值的常量),编译器可能会将它们保存在符号表中而不是实际分配内存空间。这使得const常量在效率上也具有较高的表现。

综上所述,#defineconst在定义常量时具有不同的特点和使用场景。在实际编程中,应根据具体需求选择合适的常量定义方式。一般来说,推荐使用const来定义常量,因为它具有类型安全检查、编译器优化和更好的调试支持等优点。但在某些特定场景下(如需要定义复杂的宏或需要在多个文件中共享宏定义时),使用#define可能更为合适。

3. 静态链接和动态链接有什么区别?

静态链接和动态链接是两种不同的程序链接方式,它们在程序加载和执行时有着不同的行为和特性。以下是它们之间的主要区别:

  1. 链接时间:静态链接在程序编译时就将需要的库与程序的目标文件链接在一起,形成一个完整的可执行文件。而动态链接则是在程序运行时才将库加载到内存中,并与程序进行链接。

  2. 文件大小:由于静态链接将库文件直接嵌入到可执行文件中,因此生成的可执行文件通常较大。而动态链接仅需要在运行时加载库文件,因此可执行文件较小。

  3. 内存使用:静态链接的每个程序都会包含一份完整的库代码,如果多个程序同时运行,会浪费内存空间。而动态链接的库代码在内存中只有一份,多个程序可以共享使用,节省了内存空间。

  4. 更新和部署:如果静态链接的库需要更新,那么需要重新编译和链接整个程序。而动态链接的库可以独立更新,只需要替换原有的库文件,无需重新编译和链接程序。这使得动态链接在软件的更新和部署上更加灵活和方便。

  5. 依赖性:静态链接的程序不依赖于外部库文件,可以独立运行。而动态链接的程序需要依赖于相应的动态链接库文件,如果库文件缺失或版本不兼容,程序可能无法正常运行。

  6. 加载速度:静态链接的程序在启动时不需要加载额外的库文件,因此加载速度可能较快。而动态链接的程序在启动时需要加载和链接库文件,可能会稍微慢一些。然而,在实际应用中,这种差异通常并不明显。

总的来说,静态链接和动态链接各有优缺点,适用于不同的场景和需求。在选择链接方式时,需要考虑程序的大小、内存使用、更新和部署的灵活性以及依赖性等因素。

4. 变量的声明和定义有什么区别?

在C++中,变量的声明和定义具有特定的区别,尽管在实际代码中这两个概念经常是同时出现的。以下是它们之间的主要区别:

  1. 声明(Declaration)

    • 变量的声明是告诉编译器变量的名称和类型,但不为变量分配内存空间。
    • 它只是提供了一个变量的“蓝图”或“规范”,告诉编译器在程序的某个地方有一个具有特定类型的变量。
    • 声明可以在程序的多个位置进行,例如在头文件中或在函数原型中。
    • 例如:extern int x; 这是一个声明,它告诉编译器存在一个名为 x 的整型变量,但实际的内存分配发生在别处。
  2. 定义(Definition)

    • 变量的定义是为变量分配内存空间,并可能为其指定一个初始值。
    • 定义是变量实际“诞生”的地方,在这里编译器为变量分配内存,并可以在需要时存储数据。
    • 对于给定的变量,定义只能在一个地方进行(否则会导致重复定义的错误)。
    • 例如:int x = 10; 这是一个定义,它创建了一个名为 x 的整型变量,并为其分配了内存空间,同时将其初始化为10。

在C++中,声明和定义有时可以同时发生,特别是在局部变量的情况下。例如,当你在函数内部声明一个局部变量并初始化它时,你实际上也在定义它。但是,对于全局变量或跨多个文件使用的变量,声明和定义通常是分开的,以确保正确的内存分配和链接。

此外,使用 extern 关键字可以在不定义的情况下声明一个变量。这告诉编译器变量是在程序的其他地方定义的。这种做法在大型程序中很常见,特别是当变量需要在多个源文件中共享时。一个典型的用法是在一个源文件中定义变量(如全局变量),然后在需要使用该变量的其他源文件中通过 extern 声明来引用它。

5. typedef 和define 有什么区别?

typedef#define在C++中都可以用来为类型或值创建别名,但它们之间存在一些重要的区别。

  1. 原理与处理方式:#define是预处理指令,它在预处理阶段进行简单的文本替换,不进行任何类型检查或语法检查。而typedef是C++语言的关键字,它在编译阶段处理,因此具有类型检查的功能。
  2. 作用域:#define没有作用域的限制,只要是在其之后预定义的宏,在程序的其他部分都可以使用。然而,typedef有自己的作用域,它遵循通常的C++作用域规则。
  3. 复杂类型的处理:对于复杂的类型声明,typedef能提供更加清晰和易于理解的方式。例如,对于函数指针类型,使用typedef可以使得声明更加简洁明了。而#define在处理复杂类型时可能会引发错误,因为它只是进行简单的文本替换。
  4. 调试与错误定位:由于#define是在预处理阶段进行替换的,所以如果在替换过程中发生错误,可能很难在源代码中找到错误的位置。而typedef在编译阶段处理,因此错误信息通常会直接指向源代码中的具体位置。

总的来说,typedef#define各有其用途和优点。对于简单的常量定义或简单的类型别名,#define可能更方便。但是,对于复杂的类型声明或需要类型检查的情况,typedef通常是更好的选择。在C++中,更推荐使用typedef,因为它提供了更强的类型安全性和更好的错误检查。此外,C++11引入的using关键字也可以用来定义类型别名,它在某些情况下比typedef更加灵活和易读。

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

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

相关文章

如何把PNG图片转换成CAD图纸DWG格式

环境: CAD2021 PNG图片 问题描述: 如何把PNG图片转换成CAD图纸DWG格式 解决方案: 将PNG图像转换为CAD文件(如DXF或DWG格式)是设计和工程领域中常见的需求之一。幸运的是,有几种工具和软件可以帮助完成…

幻兽帕鲁服务器多少钱?2024年Palworld服务器价格整理

2024年全网最全的幻兽帕鲁服务器租用价格表,阿里云幻兽帕鲁游戏服务器26元1个月、腾讯云32元一个月、京东云26元一个月、华为云24元1个月,阿腾云atengyun.com整理最新幻兽帕鲁专用4核16G、8核16G、8核32G游戏服务器租用价格表大全: 阿里云幻…

Java异常机制

异常体系图 Throwable Throwable 是 Java 语言中所有错误与异常的超类。 Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。 Throwable 包含了其线程创建时线程执…

计算机组成原理 浮点数溢出

阶码同样有位数限制 浮点数的溢出并不以尾数溢出来判断,尾数溢出可以通过右规操作得到纠正。运算结果是否溢出主要看结果的指数是否发生了上溢,因此是由指数上溢来判断的。可能导致溢出的情况:即所有涉及阶码运算的情况 右规和尾数舍入&…

HBase Shell基本操作

一、进入Hbase Shell客户端 先在Linux Shell命令行终端执行start-dfs.sh脚本启动HDFS,再执行start-hbase.sh脚本启动HBase。如果Linux系统已配置HBase环境变量,可直接在任意目录下执行hbase shell脚本命令,就可进入HBase Shell的命令行终端环…

【JavaWeb】Day22.maven安装介绍

目录 一.初识Maven 什么是maven? Maven的作用 二.Maven概述 1. Maven介绍 2.Maven模型 3. Maven仓库 三. Maven安装 1.下载 2. 安装步骤 1. 解压安装 2. 配置本地仓库 3.配置阿里云私服 4. 配置Maven环境变量 一.初识Maven 什么是maven? Maven是apache旗下的一个…

2024年数字IC秋招-复旦微电子-数字前端/验证-笔试题

文章目录 前言一、基础题/选做题1、什么是DMA,主要优点是什么,为什么这是它的优点2、SV的代码如下,给出$display中变量的值3、列出4bit格雷码编码,画出二进制码转格雷码电路图4、如何从慢时钟域捕获快时钟域脉冲信号,画…

行为管理设置能监控或者检测哪些东西

3 月 27 日,国新办举行“推动高质量发展”系列主题新闻发布会,浙江省省长王浩:全省市场经营主体 1040 万户,相当于平均每 6.5 个浙江人就有 1 个老板。 不由让小编想到,这么多老板,那么老板创办企业也怪不容…

蓝桥杯省三保底代码——数显+按键功能实现

目录 前言 一、为什么能保底省三 二、数显模块的实现 1.数码管显示​编辑 1)断码表 2)位选 3)段选 4)扫描 2.菜单 三、按键功能的实现 1.按键扫描 2.菜单切换 四、完整代码演示 五、结语 前言 上一期介绍全家桶时&…

【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)

文章目录 ⭐容器继承关系&#x1f339;Set容器&#x1f5d2;️HashSet源码解析构造方法public HashSet()public HashSet(Collection<? extends E> c)public HashSet(int initialCapacity, float loadFactor)HashSet(int initialCapacity, float loadFactor, boolean dum…

OpenHarmony实战开发-Web组件的使用

介绍 本篇Codelab使用ArkTS语言实现一个简单的免登录过程&#xff0c;向大家介绍基本的cookie管理操作。主要包含以下功能&#xff1a; 获取指定url对应的cookie的值。设置cookie。清除所有cookie。免登录访问账户中心。 原理说明 本应用旨在说明Web组件中cookie的管理操作。…

蓝桥杯_day6

文章目录 不同路径不同路径II拿金币珠宝的最高价值 不同路径 【题目描述】 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为…

主成成分分析法

问题引入&#xff1a; 公司评价 假设你是一个公司的财务经理&#xff0c;掌握了公司所有数据&#xff0c;如:固定资产、流动资金、借贷的数额和期限、各种税费、工资支出、原料消耗、产值、利润、折扣、职工人数、分工和教育程度等等&#xff0c;你要如何选择关键因素进行汇报…

宝宝灯塔:成都辅助生殖市场研究,海外试管成热门

据宝宝灯塔网介绍&#xff1a;在成都的辅助生殖市场中&#xff0c;生殖医院一直是主体&#xff0c;它们提供专业的医疗服务和治疗&#xff0c;帮助不孕不育人群实现生育梦想。然而&#xff0c;随着科技的进步和市场的变化&#xff0c;互联网企业也开始涉足这一领域&#xff0c;…

盏燕生物科技将出席2024第七届燕窝天然滋补品博览会

参展企业介绍 深圳市盏燕生物科技有限公司&#xff0c;办公室地址位于中国第一个经济特区&#xff0c;鹏城深圳&#xff0c;深圳市龙岗区平湖街道禾花社区富安大道18号亚钢工贸大楼1栋1017A&#xff0c;我公司主要提供一般经营项目是&#xff1a;初级农产品、海产品、化妆品、…

低代码开发能用在哪些行业?

低代码开发平台&#xff08;Low code development platform&#xff09;是无需编码&#xff08;0代码&#xff09;或通过少量代码就可以快速生成应用程序的开发平台。通过可视化进行应用程序开发的方法&#xff0c;使具有不同经验水平的开发人员可以通过图形化的用户界面&#…

computed计算属性、watch侦听器、生命周期

计算属性 点击查看 Vue文档 基础语法 多次使用计算属性&#xff0c;计算属性方法也只执行一次&#xff0c; 调用计算属性的方法不能加() 直接修改计算数学的值 计算属性不能通过双向绑定修改&#xff08;默认不能改&#xff09; 想要修改计算属性&#xff0c;就必须使用计…

夜晚水闸3D可视化:科技魔法点亮水利新纪元

在宁静的夜晚&#xff0c;当城市的霓虹灯逐渐暗淡&#xff0c;你是否曾想过&#xff0c;那些默默守护着城市安全的水闸&#xff0c;在科技的魔力下&#xff0c;正焕发出别样的光彩&#xff1f;今天&#xff0c;就让我们一起走进夜晚水闸3D模型&#xff0c;感受科技为水利带来的…

包子凑数(蓝桥杯,闫氏DP分析法)

题目描述&#xff1a; 小明几乎每天早晨都会在一家包子铺吃早餐。 他发现这家包子铺有 N 种蒸笼&#xff0c;其中第 i 种蒸笼恰好能放 Ai 个包子。 每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买 X 个包子&#xff0c;卖包子的大叔就会迅速选出若干笼…

计算机网络——29ISP之间的路由选择:BGP

ISP之间的路由选择&#xff1a;BGP 层次路由 一个平面的路由 一个网络中的所有路由器的地位一样通过LS&#xff0c;DV&#xff0c;或者其他路由算法&#xff0c;所有路由器都要知道其他所有路由器&#xff08;子网&#xff09;如何走所有路由器在一个平面 平面路由的问题 …
最新文章