栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

331-面经3

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

331-面经3

1、C++如何调用C语言函数接口?

因为C和C++生成符号的方式不同,所以C和C++语言之间的API接口是无法直接调用的。怎么办?

C语言的函数声明必须扩在extern “C”{}

__cpluscplus宏的作用是: C++编译器内置了这个宏,如果是C语言编译器来编译这个代码,没有这个宏,就直接使用C接口就可以了,如果是C++环境,因为有这个宏,extern C就会展开,告诉C++编译器这个函数sum是在C语言下生成的,调用它的话按照C语言的符号规则来去找它。按照C语言的符号规则就是sum,按照C++语言的符号规则就是sum_int_int。

2、C++什么时候会出现访问越界?

从本质上来说,访问越界就是,系统给我们分配了既定大小的内存,我们理应在这个既定大小的内存中访问,但是由于某些原因,我们访问这个内存超过了系统给我们分配的既定内存。

  1. 访问数组元素越界了
  2. vector容器访问 vector< int > vec; vec[2]; 这样也访问越界,vector是空容器,什么元素都没有
  3. string str; str[2] 空字符串,也是访问越界
  4. array(C++11提供的内存不可扩容)访问超过范围的下标也是访问越界
  5. 字符串处理,没有添加’’字符,导致访问字符串的时候越界了
  6. 使用类型强转,让一个大类型(派生类)的指针指向一块小内存(基类对象)了,然后指针解引用,访问的内存就越界了!
3、C++中类的初始化列表?
  • 可以指定对象成员变量的初始化方式,尤其是指定成员对象的构造方式;

  • 成员变量的初始化方式,初始化顺序是和定义的先后顺序有关,和在初始化列表出现的顺序是没有关系的。

4、C和C++的区别?

C++支持:

  1. 引用(是一种更安全的指针)
  2. 函数重载
  3. new/delete 和C的malloc/free有区别
  4. const, inline,带默认值参数的函数
  5. 模板,泛型编程
  6. 类和对象 OOP =》采用设计模式
  7. STL标准库
  8. 有异常(try-catch-throw) 智能指针 运算符重载(让对象的运算和内置类型一样)
5、C和C++的内存分布有什么区别?

用户区:

  • reserve,保留区(从0开始,不能读也不能写)
  • .text
  • .rodata (只能读不能写)
  • .data
  • .bss
  • heap
  • stack
  • 命令行参数和环境变量

内核区:

  • ZONE_DMA
  • ZONE_NORMAL(.text .rodata .data. bss. heap stack)
  • ZONE_HIGHMEM

所有进程都有自己的用户空间,共享内核空间!

6、int* const p和const int *p区别?

int * const p 这个const修饰的是指针p,这个p不能修改,但是*p可以修改
const int *p 这个const修饰的是 * p,*p不能修改,但是p可以修改。

7、malloc和new区别?
  1. malloc按字节开辟内存 ,new底层也是通过malloc开辟内存,但是new还可以提供初始化。
  2. malloc开辟内存失败返回的是nullptr,而 new开辟失败,抛出bad_alloc类型的异常
  3. malloc 是调用C的库函数 new是operator new,是运算符的重载函数
  4. malloc 不管是开辟单个的内存还是数组的内存,方式都是一样的。
    而new开辟单个的是 new int(10); 开辟内存数组的是new int[20] (); 没有new int[20] (40)这样的功能。
8、map&set容器的实现原理?
  • set称作集合,只存储key;
  • map映射表,存储[key,value]键值对,
  • 它们的底层数据结构都是红黑树,都是通过key进行元素比较
9、shared_ptr引用计数存在哪里?

定义一个shared_ptr< int > ptr(new int)的智能指针对象时,该智能指针对象本身的内存是8个字节,如下图所示:


把智能指针管理的外部资源以及引用计数资源都画出来的话,就是如下图的展示:

堆上分配的!

STL、map底层、deque底层、vector里的empty()和size()的区别、函数对象?

STL标准容器 :

  • 顺序容器(vector,deque,list)
  • 容器适配器(stack,queue,priority_queue)
  • 关联容器(有序(set和map)和无序(底层是链式哈希表),map底层是红黑树)
  • 近容器 数组,string,bitset 迭代器 泛型算法

deque底层是动态开辟的二维数组
deque的实现有这2个宏 ,一维默认size是2

比如说用整型实例化deque,二维大小就是1024
deque底层内存不是连续的, 正在开辟的二维数组

vector里的empty()和size():


用last-first;

  • first指向的是vector底层内存的起始地址;
  • last指向的是最后一个有效元素的后继位置;
  • end指向的是内存的末尾地址;

函数对象:
函数对象(拥有()运算符重载函数)

使用在泛型算法当中:
operator() test(); test.operator()(); sort find_if priority_queue set map

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/961078.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号