【1】C++岗位求职面试八股文系列文章(语言基础)
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[1]简述下C++语言的特点
C++在C语言基础上引入了面对对象的机制,同时也兼容C语言。C++有三大特性(1)封装。(2)继承。(3)多态;C++语言编写出的程序结构清晰、易于扩充,程序可读性好。C++生成的代码质量高,运行效率高,仅比汇编语言慢10%~20%;C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等;C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL(Standard Template Library)。同时,C++是不断在发展的语言。C++后续版本更是发展了不少新特性,如C++11中引入了nullptr、auto变量、Lambda匿名函数、右值引用、智能指针。
[2]简述下C语言的特点
C语言有出色的可移植性 ,能在多种不同体系结构的软/硬平台上运行简洁紧凑,使用灵活的语法机制 ,并能直接访问硬件。C语言具有很高的运行效率,直接操作底层寄存器,
[3]为什么嵌入式用C多
能够直接访问硬件的语言有汇编和C语言,汇编属于低级语言,难以完成一些复杂的功能,但是汇编比C语言访问硬件的效率更高。所以,一般将硬件初始化的工作交给汇编,比较复杂的操作交给C语言。
[4]面向对象的特征并简述包括四大基本特征和五大基本原则。特征:抽象、继承、多态、封装原则:单一职责原则、开放封闭原则、替换原则、依赖原则、接口分离原则
[4]面向对象的特征并简述
包括四大基本特征和五大基本原则。特征:抽象、继承、多态、封装原则:单一职责原则、开放封闭原则、替换原则、依赖原则、接口分离原则
[5]面向过程与面向对象
面向过程的语言:优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;缺点:没有面向对象易维护、易复用、易扩展面向对象的语言:优点:易维护、易复用、易扩展,缺点:性能比面向过程低
[6]智能指针
智能指针的作用是,能够处理内存泄露问题和悬空指针问题(未释放内存、释放内存但指针没置空)https://blog.csdn.net/sjp11/article/details/123899141智能指针的实现:
成员变量:ptr指针对象,ptrcount引用计数,mt互斥锁成员函数:构造,析构,赋值=,解引用*,拷贝,->
[7]野指针:悬空指针:空指针
野指针是没有被初始化过的指针,指向的位置是不可知的(随机的、不正确的、没有明确限制的)。此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。成因:指针变量未初始化、指针释放后之后未置空、指针操作超越变量作用域解决:初始化时置 NULL、释放时置 NULL
悬空指针:指针最初指向的内存已经被释放了的一种指针。(例子:返回局部变量的地址)
空指针:指针的值为0,不指向任何有效数据
产生原因及解决办法:野指针:指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。悬空指针:指针free或delete之后没有及时置空 => 释放操作后立即置空。
[8]野指针避免办法
(1)初始化置NULL(2)申请内存后判空(3)指针释放后置NULL(4)使用智能指针
[9]指针数组和数组指针
指针数组:数组,元素是指针类型 int* arr[3]={&num1,&num2,&num3};数组指针:指针,指向数组 int(* p)[3]=&arr;
不能把数组当参数直接传进来:画绿线值为4
正确传法:
[10]Sprintf strcpy memcpy
[11]区间迭代用过哪些,迭代器与数组异同
迭代器:迭代器是一种检查容器内元素并遍历元素的数据类型所有标准库容器都可以使用迭代器使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素特殊情况下如果容器为空,则 begin 和 end 返回的是同一个迭代器和指针类似,也能通过解引用迭代器来获取它所指示的元素
如果 vector 对象或 string 对象是一个常量,begin和end返回const_iterator;
如果 vector 对象或 string 对象不是常量,begin和end返回iterator
为了便于专门得到const_iterator类型(只需读操作而无须写操作)的返回值 , C ++11 新标准引入了两个新函数 , 分别是 cbegin和 cend。
指针可以用来遍历存储空间连续的数据结构,迭代器(Iterator)是指针(pointer)的泛化,可以用来遍历存储空间连续或不连续的数据结构,如vector,list,deque,map,set等
随机访问迭代器,可以通过直接偏移量访问(比如it+5即可访问it的后面第五个元素
双向迭代器,可以通过++ --操作访问前后元素
单向迭代器,可以通过++访问下一元素
[12]stack/queue/优先队列/红黑数
Stack:标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque。
Queue:标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为queue指定特定的底层容器, 默认情况下使用deque。
优先队列:本质是堆,标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector
红黑数:
多路复用技术的Epoll的核心结构也是红黑树+双向链表。
[13]字符串指针变量/字符数组/字符指针数组
Const char* flower=”hello”;Cout<<flower<<endl; //hello
当cout对象处理字符地址时候,不是打印地址,而是打印这个地址对应字符的内容,继续往后输出后面内容,直至‘\0’
第一个里的”helloworld”在常量区,第二个里的”helloworld”在栈存放,
字符指针数组:
[14]数组名和指针(这里为指向数组首元素的指针)区别?
• 二者均可通过增减偏移量来访问数组中的元素。• 数组名不是真正意义上的指针,可以理解为常指针,所以数组名没有自增、自减等操作。• 当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。
[15]char str[]与char *str的区别
第一个表达式表示的是在动态变量区中开辟一个能连续放6个字符的数组,数组名称是str.而赋值运算符右边是一个字符串常量,这个字符串常量是存放在常量区的,这个表达式的意思就是将“hello”这个字符串常量拷贝到刚才开辟的数组中。
第二个表达式的意思是在动态变量区中开辟一个存放指针的存储单元,指针变量名是str,"hello"同样也是一个字符串常量,存储在常量区,在程序的运行过程中一直存在。把字符串“hello”的地址值拷贝到刚才的存储单元中,即指针变量str的初值是字符串“hello”的地址。
在局部变量区域建安里一个数组,吧常字符串放进去,返回的是数组首地址。当局部函数结束时候,数组释放,其首地址无意义。
字符指针指向常字符串首地址,局部函数结束,但常字符串还存在,指向的地址还没变。两种情况下:因为局部函数里返回的都是指针而不是普通变量,所以可以返回到主函数里。
[16]字符和字符串处理函数
s.erase(坐标, 个数);s.insert(坐标, 插入的字符串);//不能是字符s.insert(坐标, 个数,插入的字符);s.substr(坐标, 个数);
字符查找:
从temp字符串查找‘l’第一次出现的位置,返回指针p;通过p-temp初始指针得到位置。
字符串查找:
字符串转换函数:
[17]C++中新增了string,它与C语言中的 char *有什么区别吗?它是如何实现的
string继承自basic_string,其实是对char进行了封装,封装的string包含了char数组,容量,长度等等属性。string可以进行动态扩展,在每次扩展的时候另外申请一块原空间大小两倍的空间(2^n),然后将原字符串拷贝过去,并加上新增的内容。
[18]什么情况用指针当参数,什么时候用引用,为什么?
如果数据对象是数组,则使用指针(唯一的选择),并且指针声明为指向const的指针如果数据对象是类对象,则使用const引用(传递类对象参数的标准方式是按照引用传递)
[19]静态绑定和动态绑定
• 对象的静态类型:对象在声明时采用的类型。是在编译期确定的。• 对象的动态类型:目前所指对象的类型。是在运行期决定的。对象的动态类型可以更改,但是静态类型无法更改。• 静态绑定:绑定的是对象的静态类型,某特性(比如函数依赖于对象的静态类型,发生在编译期。)• 动态绑定:绑定的是对象的动态类型,某特性(比如函数依赖于对象的动态类型,发生在运行期。
[20]strlen和sizeof区别?
• sizeof是运算符,结果在编译时得到;strlen是字符处理的库函数。• sizeof参数可以是任何数据的类型或者数据(sizeof参数不退化);strlen的参数只能是字符指针且结尾是'\0'的字符串。• 因为sizeof值在编译时确定,所以不能用来得到动态分配(运行时分配)存储空间的大小
一个指针占内存的大小跟编译环境有关,而与机器的位数无关。
[后续]见C++岗位求职面试八股文第二篇
更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317
企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm
机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0
软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM
更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH
欢迎关注、收藏、点赞后进行问题咨询及秋招建议!!
#软件开发薪资爆料##实习,投递多份简历没人回复怎么办##我的求职思考##如何判断面试是否凉了##在找工作求抱抱#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等