C++面试速通宝典——11

news2024/10/6 21:32:32

188. 总结static的应用和作用

  1. 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
  2. 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问。
  3. 在模块内的static函数只可被这一模块的其他函数调用,这个函数的适用范围被限制在声明它的模块内。
  4. 在类中的static成员变量属于整个类所拥有,对类的对象只有一份拷贝
  5. 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。

189. 总结const的应用和作用

  1. 阻止一个变量被改变,可以使用const关键字。在定义const变量时,通常需要对它初始化,因为以后就没有机会去改变他了。
  2. 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const。
  3. 在一个函数声明中,const可以修饰形参,表明他是一个输入参数,在函数内部不能改变其值
  4. 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量
  5. 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

190. 什么是指针?谈谈你对指针的理解。

  1. 指针是一个变量,该变量专门存放内存地址。
  2. 指针变量的类型取决于其指向的数据类型,在所指数据类型前加*。
  3. 指针变量的特点是他可以访问所指向的内存

191. 什么是常指针?什么是指向常变量的指针?

‌‌‌‌  常指针的含义是该指针所指向的地址不能改变,但该地址所指向的内容可以变化,使用常指针可以保证我们的指针不能指向其他变量。

‌‌‌‌  指向常变量的指针是指该指针的变量本身的地址可以发生变化,可以指向其他的变量,但是他所指的内容不可以被修改

192. 函数指针和指针函数的区别?

‌‌‌‌  函数指针指向一个函数入口的指针
‌‌‌‌  指针函数函数的返回值是一个指针类型

193. 简述Debug版本和Release版本的区别?

‌‌‌‌  Debug版本是调试版本Release版本是发布给用户的最终非调试版本

194. 指针的几种典型应用情况

  1. int *p[n] —— 指针数组,每个元素均为指向整形数据的指针。
  2. int (*)p[n]——p为指向一维数组的指针,这个一维数组有n个整型数据。
  3. int *p()——函数带回指针,指针指向返回的值。
  4. int (*)p()——p为指向函数的指针。

195. static函数与普通函数有什么区别?

‌‌‌‌  static函数在内存中只有一份普通函数在每个被调用中维持一份拷贝

196. struct(结构)和union(联合)的区别?

  1. struct union 都是由多youdao个不同的数据类型的成员组成但在任何同一时刻联合中只存放了一个被选中的成员所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)
  2. 对于 union 的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值时互不影响的。

解释

结构体 (struct)

  1. 存储:结构体中的所有成员都有自己的独立存储空间。每个成员的地址相对于结构体变量的基地址是固定的,并且所有成员可以同时存在。
  2. 成员访问:访问结构体的不同成员之间互不影响。例如,如果你向一个成员赋值,这个操作不会影响其他成员的值。
#include <stdio.h>

struct ExampleStruct {
    int integer;
    float decimal;
    char character;
};

int main() {
    struct ExampleStruct s;
    s.integer = 10;
    s.decimal = 3.14;
    s.character = 'A';

    printf("integer: %d\n", s.integer);       // 输出: integer: 10
    printf("decimal: %f\n", s.decimal);       // 输出: decimal: 3.140000
    printf("character: %c\n", s.character);   // 输出: character: A

    return 0;
}

‌‌‌‌  在这个例子中,ExampleStruct 结构体中的三个成员 integerdecimal 和 character 拥有独立的存储空间,互不影响。

联合体 (union)

  1. 存储:联合体的所有成员共享同一块存储空间。这意味着在任何给定时间,联合体只能存储其中一个成员的值。联合体的大小是它最大成员的大小
  2. 成员访问:当你给联合体的一个成员赋值时,这个值会影响其他成员,因为所有成员共享同一块存储空间。仅最后赋的值会被保存。
#include <stdio.h>

union ExampleUnion {
    int integer;
    float decimal;
    char character;
};

int main() {
    union ExampleUnion u;
    u.integer = 10;
    printf("integer: %d\n", u.integer);       // 输出: integer: 10
    
    u.decimal = 3.14;
    printf("decimal: %f\n", u.decimal);       // 输出: decimal: 3.140000
    printf("integer: %d\n", u.integer);       // 可能会输出一个不可预测的值,因为它已经被覆盖
    printf("character: %c\n", u.character);   // 可能会输出随机字符,因为它已经被覆盖

    u.character = 'A';
    printf("character: %c\n", u.character);   // 输出: character: A
    printf("decimal: %f\n", u.decimal);       // 可能会输出一个不可预测的值,因为它已经被覆盖

    return 0;
}

‌‌‌‌  在这个例子中,ExampleUnion 联合体中的三个成员 integerdecimal 和 character 共享同一个存储空间。当你改变其中一个成员的值时,其他成员的值会被覆盖且不可预测。

关键区别总结:

  1. 存储空间

    • struct 中每个成员都有自己独立的存储空间,因此可以同时存在。
    • union 中所有成员共享同一个存储空间,因此在任何一个时间点只能存储一个成员的值。
  2. 成员间的关系

    • 在 struct 中,修改一个成员的值不会影响其他成员。
    • 在 union 中,修改一个成员的值会影响其他成员,因为所有成员存储在同一块内存中。
  3. 用途

    • struct 通常用于需要同时保存多个不同类型的数据的场景。
    • union 通常用于需要在不同时间存储不同类型但不需要同时保存不同类型数据的场景,例如保存一个值的不同视图或表示方式。

扩展理解:

  • 大小

    • 一个 struct 的大小是所有成员大小之和,可能还包括内存对齐导致的间隙。
    • 一个 union 的大小是其最大成员的大小,因为所有成员共用一块内存。
  • 内存对齐

    • 结构体成员是按照定义顺序排列的,通常需要考虑内存对齐的问题以提高访问效率。
    • 联合体的所有成员从同一内存地址开始,不存在内存对齐间隙的问题。

197. class 和 struct 的区别?

‌‌‌‌  struct 的成员默认是公有的,而类的成员默认是私有的

198. 简述枚举类型

‌‌‌‌  枚举方便一次定义一组常量,使用起来很方便。

解释

简述

‌‌‌‌  枚举类型,是编程语言(如C、C++、Java, Python等)中的一种数据类型,允许开发者定义一组命名的整数常量。这些常量被称为枚举成员,每个枚举成员隐式地对应一个整数值。

解释

  • 定义固定值:枚举方便一次定义一组相关的常量,类似于有意义的标签,便于代码的阅读和维护。
  • 提高代码可读性:使用枚举可以避免魔法数(magic numbers),这些常量在代码中有清晰的名称,增强了可读性和可维护性。
  • 便于管理:集中管理这些常量,增加新值或修改现有值时,只需在枚举定义中进行修改,减少了疏漏和出错的机会。

示例

C 语言
#include <stdio.h>

// 定义一个枚举类型
enum Day {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
};

int main() {
    enum Day today = WEDNESDAY;
    printf("Today is: %d\n", today);  // 输出: Today is: 3
    return 0;
}

‌‌‌‌  在这个例子中, Day 枚举定义了一个一周的天数,每个枚举成员都隐式地被赋值为一个整数,从0开始(SUNDAY是0,MONDAY是1,依次类推)。

Java 语言
public class EnumExample {
    // 定义一个枚举类型
    enum Day {
        SUNDAY,
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY
    }

    public static void main(String[] args) {
        Day today = Day.WEDNESDAY;
        System.out.println("Today is: " + today);  // 输出: Today is: WEDNESDAY
    }
}

‌‌‌‌  Java 的枚举更加强大,它不仅仅是整数常量,还可以定义字段、方法等,像类一样使用。

补充

  1. 默认值与自定义值
    • 在C语言中,枚举成员从0开始递增,你也可以手动为枚举成员指定值。例如:
     enum Day {
         SUNDAY = 1,
         MONDAY,
         TUESDAY = 5,
         WEDNESDAY,
         THURSDAY,
         FRIDAY = 10,
         SATURDAY
     };
     // MONDAY = 2, WEDNESDAY = 6, THURSDAY = 7, SATURDAY = 11
  • 在这种情况下,后续未指定值的成员将按之前的值递增。
  1. 作用域与类型安全

    • 在 C 语言中,枚举成员在编译时期被替换为整数值,具有相同作用域但不严格的类型检查。
    • 在 Java 中,枚举是一个真正的类类型,具有类型安全和严格的作用域管理。
  2. 扩展功能

    • 高级语言中的枚举(如 Java 和 C#)可以包含字段、方法,可以实现接口。
    • 可以为枚举添加构造函数、属性以及方法,甚至使用枚举实现一些设计模式,如单例模式。
  3. 应用场景

    • 枚举常用于定义一组相关但有限的常量值集,如一周的天数、月份、状态码、颜色等等。
    • 在状态机实现、资源标识(如HTTP状态码)等需要预定义一组固定值的地方,枚举是一种非常方便的选择。

总结

‌‌‌‌  枚举类型是一种便捷的方式来定义常量集合,便于后续代码的使用、维护和阅读。通过使用枚举,能有效避免魔法数,提高程序的可读性和可靠性,并在一定程度上帮助实现类型安全。

‌‌‌‌  这里 , “魔法数”(magic number)在编程中指的是直接在代码中使用的具体数字常量,这些数字通常没有明显的意义或解释。使用魔法数会降低代码的可读性和可维护性,因为它们不直观,不能清晰地表达其在程序中的作用或含义。

魔法数的例子

假设有一段代码如下:

int calculateBonus(int level) {
    if (level == 1) {
        return 500;
    } else if (level == 2) {
        return 1000;
    } else if (level == 3) {
        return 1500;
    }
    return 0;
}

‌‌‌‌  在这段代码中,12350010001500 都是魔法数。它们的含义不清晰,读者无法通过代码直接了解这些数字的具体意义。

使用枚举和常量来避免魔法数

‌‌‌‌  通过使用枚举和常量,可以提高代码的可读性和可维护性。重写上述代码,使用枚举类型和常量:

enum Level {
    BEGINNER = 1,
    INTERMEDIATE = 2,
    ADVANCED = 3
};

const int BEGINNER_BONUS = 500;
const int INTERMEDIATE_BONUS = 1000;
const int ADVANCED_BONUS = 1500;

int calculateBonus(Level level) {
    switch(level) {
        case BEGINNER:
            return BEGINNER_BONUS;
        case INTERMEDIATE:
            return INTERMEDIATE_BONUS;
        case ADVANCED:
            return ADVANCED_BONUS;
        default:
            return 0;
    }
}

好处

  1. 可读性

    • 通过使用有意义的枚举值和常量名,代码更加直观,读者能够轻松理解每个值的含义。
  2. 可维护性

    • 如果需要修改某个值,只需更改定义处即可,减少了出错的可能性。
  3. 类型安全

    • 枚举类型提供了一定程度的类型检查,减少了将无效值传递给函数的风险。
  4. 避免重复

    • 避免了在多个地方重复使用相同的魔法数,使代码更干净、更一致。

总结

‌‌‌‌  魔法数是直接在代码中使用的具体数字常量,通常没有明显的解释或含义。通过使用枚举类型和常量,可以有效避免魔法数,提高代码的可读性、可维护性和类型安全性。这是一种良好的编程实践,能够使代码更加清晰、易懂和易于管理。

199. assert()的作用?

‌‌‌‌  assert() 是一个调试程序时经常使用的宏在程序运行时他计算括号内的表达式,如果表达式为False(0),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。

‌‌‌‌  这个宏通常用来判断程序中是否出现了明显的非法数据,如果出现了终止程序以免导致更严重的后果,同时也便于查找错误。

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

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

相关文章

鸿蒙开发(NEXT/API 12)【穿戴设备传感器获取】手机侧应用开发

手机侧应用可以通过Wear Engine获取穿戴设备上的传感器信息&#xff0c;并通过打开、关闭命令控制获取传感器数据。 使用传感器相关接口前&#xff0c;需要向手机侧用户申请获取对应权限的授权 传感器类型申请权限ECG、PPG、HR[HEALTH_SENSOR]人体传感器ACC、GYRO、MAG[MOTIO…

汇编DEBUG程序调用

工具 系统&#xff1a;Windows 11 应用&#xff1a;DOSBox 0.74-3 下载安装教程&#xff1a;本人写的《DOSBox下载安装&#xff08;Windows系统 DOSBox 0.74-3&#xff09;》 https://blog.csdn.net/just_do_it_sq/article/details/142715182?spm1001.2014.3001.5501 相关文…

C++ 算法学习——1.3 深度优先搜索

深度优先搜索&#xff1a;简单讲就是搜到某条路尽头&#xff0c;再掉头回溯搜其他的路。此中重点是尽头的判断&#xff0c;和对走过的路进行标记。 一般采用递归的写法&#xff0c;模板大致如下&#xff1a; DFS(node,visited):if node is in visited:returnadd node to visi…

通用mybatis-plus查询封装(QueryGenerator)

结果如下图所示 java类代码分别如下 1 package com.hdx.contractor.util.mybatis;import com.hdx.contractor.common.user.SecurityUser; import com.hdx.contractor.common.user.UserDetail; import com.hdx.contractor.util.query.oConvertUtils; import lombok.extern.slf…

OpenHarmony(鸿蒙南向开发)——轻量系统芯片移植案例(一)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 轻量带屏解决方案之恒玄芯片移植案例 本文章基于恒玄科技BES2600W…

【AI知识点】交叉验证(Cross-Validation)

交叉验证&#xff08;Cross-Validation&#xff09; 是机器学习中常用的一种模型评估方法&#xff0c;用于评估模型的性能和泛化能力。它通过在不同的训练集和验证集上多次训练和测试模型&#xff0c;从而有效地评估模型在未见数据上的表现&#xff0c;帮助防止模型的过拟合和欠…

【RTD MCAL 篇2】 K312 UART DMA

【RTD MCAL 篇2】 K312 UART DMA 一&#xff0c;文档简介二&#xff0c; 功能实现2.1 K312 MINIEVB硬件配置2.2 EB 配置2.2.1 Mcl module2.2.2 Mcu module2.2.3 Platform module2.2.4 Port module2.2.5 Uart module2.2.6 Rm module 2.3 main code 三&#xff0c;测试结果 一&am…

Clio——麻省理工学院增强机器人场景理解算法

概述 机器人感知长期以来一直受到现实世界环境复杂性的挑战&#xff0c;通常需要固定设置和预定义对象。麻省理工学院的工程师 已经开发了Clio这项突破性的系统可以让机器人直观地理解并优先考虑周围环境中的相关元素&#xff0c;从而提高其高效执行任务的能力。 了解对更智…

【Python】Marmir 使用指南:Python 驱动的电子表格生成器

Marmir 是一个由 Python 驱动的电子表格生成工具&#xff0c;专门用于将 Python 数据结构&#xff08;如字典、列表等&#xff09;转换为电子表格文件&#xff08;如 Excel&#xff09;。Marmir 的设计目标是提供比传统电子表格库&#xff08;如 xlwt&#xff09;更强大和灵活的…

ctf.bugku-备份是个好习惯

访问页面得到字符串 这串字符串是重复的&#xff1b; d41d8cd98f00b204e9800998ecf8427e 从前端、源码上看&#xff0c;除了这段字符串&#xff0c;没有其他信息&#xff1b;尝试解密&#xff0c;长度32位&#xff1b;各种解密方式试试&#xff1b; MD5免费在线解密破解_MD5在…

文件后缀名不见了怎么办?

有一天&#xff0c;突然有需要更改文件的后缀名&#xff0c;可奇怪的是文件只有名称&#xff0c;后缀不见了&#xff0c;这该如何修改呢&#xff1f; 第一步&#xff1a;打开此电脑&#xff0c;最上面一栏选择“查看” 第二步&#xff1a;将“文件扩展名”勾选上 第三步&…

会议时如何实现扫码签到?

如何实现扫码签到&#xff1f; 在现代活动管理中&#xff0c;签到环节是不可或缺的一部分。它不仅关系到活动的顺利进行&#xff0c;还涉及到参与者的体验。传统的签到方式往往耗时且效率不高&#xff0c;而随着技术的发展&#xff0c;扫码签到成为了一种高效且便捷的解决方案。…

用小学生可以理解的语言讲一下什么是大模型

好的&#xff0c;用小学生的语言来说&#xff0c;大模型就像是一个超级聪明的机器人老师&#xff0c;它懂得很多东西&#xff0c;可以帮助我们做很多事情。 1. **懂得很多**&#xff1a;大模型知道很多知识&#xff0c;就像一个巨大的图书馆&#xff0c;里面有很多书&#xff0…

【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括但不限于&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三。 后面会经常写一下博客&…

归并排序:递归、非递归实现、文件排序(归并排序实现)

目录 归并排序递归实现 1.归并排序基本思想 2.归并排序单趟思路 3.代码思路步骤 3.1.归并排序实现思路步骤 3.2.总结 3.2.1.数组归并与链表归并的差异 (1)数组归并 (2)链表归并 (3)总结 3.2.2.归并排序的递归实现总结 4.归并排序递归实现代码 5.归并排序递归递归展…

用AI做电子萌宠,快速涨粉变现

今天给大家分享一个很热门的小副业—AI宠物视频 项目介绍 前一阵刷到一个萌宠账号&#xff0c;爆款率可真高&#xff0c;涨粉可真快呀。 28篇笔记涨粉3.2万&#xff0c;点赞更是达到了十几万。其中有6篇点赞上万。 至于究竟是不是AI其实没那么重要&#xff0c;重要的是&…

华为OD机试 - Excel单元格数值统计(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

安可数据库产品目录

‌国家安可数据库产品目录包括以下主要产品‌&#xff1a; ‌华为GaussDB、openguass&#xff1a; 由华为云计算技术有限公司提供。‌金仓数据库管理系统&#xff1a;由中电科金仓&#xff08;北京&#xff09;科技股份有限公司提供。‌神通数据库管理系统&#xff1a;由天津神…

上学迟到问题

刚看到这题时&#xff0c;我突然就有了思路。说起来挺可笑的当我写完这题后&#xff0c;并成功AC时&#xff0c;看着我那冗长的代码我陷入了深思&#xff0c;难道真的有必要写这么一长串吗? 这是我的代码 #include<stdio.h> int main(){int s,v,t;scanf("%d %d&q…

ROW_NUMBER

How to rewrite a query which uses the ROW_NUMBER() window function in versions 5.7 or earlier before window functions were supported e.g., SELECT ROW_NUMBER() OVER (PARTITION BY fieldA) AS rownum, myTable.* FROM myTable; index 用不上的 Solution Assuming…