C++八股文之语言基础篇

2024-09-01 12:36
文章标签 语言 基础 c++ 八股文

本文主要是介绍C++八股文之语言基础篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🤖个人主页:晚风相伴-CSDN博客

思维导图链接:C++语言基础

持续更新中……

💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧

🙏如果内容有误或者有写的不好的地方的话,还望指出,谢谢!!!

让我们共同进步

​​

目录

1、C语言和C++的区别

 2、struct和class的区别

3、C语言和C++结构体的区别 

4、静态链接和动态链接

5、C语言和C++编译时的区别

6、static关键字的作用 

7、函数指针

 8、静态变量什么时候初始化

9、野指针 

10、内联函数和宏的区别 

11、new和malloc的区别 

12、指针和引用的区别 

13、内存泄漏 

14、热重载 


1、C语言和C++的区别

  1. C语言是C++的子集,C++可以很好兼容C语言。此外C++又有很多新的特性,如引用、智能指针等等
  2. C++是面向对象的编程语言,C语言是面向过程的编程语言
  3. C语言有一些不安全的语言特性,如指针使用的潜在危险、强置类型转换的不确定性、内存泄漏等,C++对此增加了不少新特性来改善安全性,如引用、智能指针、try-catch异常等。
  4. C++复用性高,C++引入了模板和STL库相比于C语言更灵活、更通用

 2、struct和class的区别

  1. struct一般用于描述一个数据结构集合,而class是对一个对象数据的封装
  2. struct中默认的访问控制权限是public,而class中默认的访问控制权限是private
  3. 在继承关系中,struct默认是公有继承,而class默认是私有继承
  4. class可以用于定义模板参数,而struct不能

3、C语言和C++结构体的区别 

  1. C语言的结构体内不允许有函数的存在,C++允许有内部成员函数,且允许该函数是虚函数
  2. C的结构体内部成员变量的访问权限只能是public,而C++允许public、protected、private。
  3. C语言的结构体是不可以继承的,C++的结构体是可以从其他结构体或类继承过来的
  4. C语言中使用结构体需要加上struct关键字,而C++则可以省略该关键字

4、静态链接和动态链接

静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中。Windows下以.lib为后缀,Linux下以.a为后缀
动态链接,是在代码运行过程中,再去找要链接的函数。Windows下以.dll为后缀,Linux下以.so为后缀。

5、C语言和C++编译时的区别

因为C++支持函数重载,所以在编译时不仅仅是函数名,还会将函数的参数类型也加到编译后的代码中;C语言不支持重载,所以在编译时一般只包括函数名

6、static关键字的作用 

  1. 定义全局静态变量和局部静态变量,在变量前加static。初始化的静态变量会在数据段分配内存,未初始化的静态变量会在BSS段分配内存。只不过全局静态变量和局部静态变量的作用域不一样。
  2. 定义静态函数和静态变量,静态函数和静态变量只能在本源文件中使用
  3. 定义类中的静态成员变量和静态成员函数。类中的所有成员变量拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间
  4. C++中规定,静态成员函数中没有this指针,因为它不属于任何一个对象

​ 

7、函数指针

  1. 函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指的地址
  2. 定义 int func(int a);     int (*f)(int a);  f = &func; 
  3. 应用场景:回调

 8、静态变量什么时候初始化

对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。
C++标准规定,全局或静态对象当且仅当对象首次用到时才进行构造 

9、野指针 

  1. 野指针就是指针指向的位置是不可知的
  2. 产生原因:释放内存后指针没有及时置空,依然指向了该内存,那么可能出现非法访问的错误。
  3. 避免办法:初始化置NULL、申请内存后判空、指针释放后置NULL、使用智能指针

10、内联函数和宏的区别 

  1. 宏定义不是函数,内联本质上是一个函数
  2. 宏定义在预编译的时候就把所有宏名来替换,而内联函数是在编译时进行代码插入,并且在调用的地方将内容展开,这样可以省去函数调用的开销,提高效率
  3. 宏定义没有类型检查,而内联函数会进行类型检查

11、new和malloc的区别 

  1. new是操作符,而malloc是函数
  2. new在调用时先分配内存,再调用构造函数,释放时调用析构函数,而malloc没有构造函数和析构函数
  3. malloc需要给定申请内存的大小,返回时的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转
  4. new可以被重载,malloc则不行
  5. new分配内存更直接和安全
  6. new会抛异常,malloc则会返回NULL

12、指针和引用的区别 

空值:指针可为空,引用必须指向有效对象
初始化:指针使用前可未初始化,但引用必须初始化
可变性:指针可重新指向不同的对象,引用一旦绑定则不可变
类型检查:指针类型相对宽松,引用类型严格
内存占用:指针占用固定大小内存,引用不额外占用
多级:指针可多级,引用只能一级

引用的底层还是用的指针,所以引用也是会占内存的 

13、内存泄漏 

简单地说就是申请了一块内存空间,使用完毕后没有释放掉。
(1)new和malloc申请资源使用后,没有用delete和free释放
(2)子类继承父类,父类析构函数不是虚函数
(3)Windows句柄资源使用后没有释放

内存泄漏检测
①良好的编码习惯,使用了内存分配的函数,一旦使用完毕,要记得使用其相应的函数释放掉
②将分配的内存的指针以链表的形式自行管理,使用完毕之后从链表中删除,程序结束可检查该链表
③使用智能指针
④使用一些工具,如ccmalloc、Dmalloc、Leaky、Valgrind等等。 

14、热重载 

允许开发人员在不重启应用程序的情况下动态地加载、更新或替换代码的技术 

这篇关于C++八股文之语言基础篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126948

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve