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++什么时候会出现访问越界?
从本质上来说,访问越界就是,系统给我们分配了既定大小的内存,我们理应在这个既定大小的内存中访问,但是由于某些原因,我们访问这个内存超过了系统给我们分配的既定内存。
- 访问数组元素越界了
- vector容器访问 vector< int > vec; vec[2]; 这样也访问越界,vector是空容器,什么元素都没有
- string str; str[2] 空字符串,也是访问越界
- array(C++11提供的内存不可扩容)访问超过范围的下标也是访问越界
- 字符串处理,没有添加’\0’字符,导致访问字符串的时候越界了
- 使用类型强转,让一个大类型(派生类)的指针指向一块小内存(基类对象)了,然后指针解引用,访问的内存就越界了!
3、C++中类的初始化列表?
-
可以指定对象成员变量的初始化方式,尤其是指定成员对象的构造方式;
-
成员变量的初始化方式,初始化顺序是和定义的先后顺序有关,和在初始化列表出现的顺序是没有关系的。
4、C和C++的区别?
C++支持:
- 引用(是一种更安全的指针)
- 函数重载
- new/delete 和C的malloc/free有区别
- const, inline,带默认值参数的函数
- 模板,泛型编程
- 类和对象 OOP =》采用设计模式
- STL标准库
- 有异常(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区别?
- malloc按字节开辟内存 ,new底层也是通过malloc开辟内存,但是new还可以提供初始化。
- malloc开辟内存失败返回的是nullptr,而 new开辟失败,抛出bad_alloc类型的异常
- malloc 是调用C的库函数 new是operator new,是运算符的重载函数
- 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