C++面试

1、静态函数和虚函数的区别?
答:静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定,虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销。
2、用过static吗,能说下static吗?
答:C/C++共有:
1)修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。
2)修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
3)修饰函数时,表明该函数只在同一文件中调用。
C++独有:
1)修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有;
2)用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量。
3、请你说一下,struct和class的区别?
答:在C++中,可以使用struct和class定义类,都可以继承,区别在于:struct默认的继承和访问权限是public,class默认的继承和访问权限是private
另外,class还可以定义模板类形参,比如template<class T, int i>
4、请你说一下,一个C++源文件到可执行文件经历的过程?
答:对于C++源文件,从文本到可执行文件一般需要四个过程:
预处理阶段:对于源码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。
编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件
汇编阶段:将编译阶段的汇编文件转成机器码,生成可重定位目标文件
链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件
5、说一下new和malloc的区别?
(1)new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配;
(2)new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需要进行类型转化。
(3)new不仅分配一段内存,而且会调用构造函数,malloc不会。
(4)new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free则不会。
(5)new是一个操作符可以重载,malloc是一个库函数。
(6)malloc分配的内存不够的时候,可以用realloc扩容。扩容的原理?new没用这样操作。
(7)new如果分配失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。
(8)申请数组时: new[]一次分配所有内存,多次调用构造函数,搭配使用delete[],delete[]多次调用析构函数,销毁数组中的每个对象。而malloc则只能sizeof(int) * n。
6、指针和引用的区别?
答:(1)指针只是一个变量,只不过这个变量存储的是一个地址;而引用跟原来的变量实质是同一个东西,只不过是原变量的一个别名而已,不占用内存空间;
(2)引用必须在定义的时候初始化,而且初始化后就不能再改变;而指针不必在定义的时候初始化,初始化之后可以改变;
(3)指针可以为空,但引用不能为空(这意味这我们拿到一个引用的时候,是不需要判断引用是否为空的,而拿到一个指针的时候,我们则需要判断它是否为空,这点经常在判断参数是否有效的时候使用);
(4)sizeof(引用)=指向变量的大小,sizeof(指针)指针本身的大小;
(5)指针可以有多级,引用只有一级;
7、const的作用?
答:(1)定义变量为只读变量,不可修改;
(2)修饰函数的参数的参数和返回值;
(3)const成员函数(只需要在成员函数参数列表后加上关键字const,如:char get() const;) 可以访问const成员变量和非const成员变量,但不能修改任何变量,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const成员函数。
(4)const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数,即对于class A,有const a; 那么a只能访问A的const成员函数。而对于A b;b可以访问任何成员函数。
使用const关键字修饰的变量,一定要对变量进行初始化
8、C++内存管理:
答:栈:存放函数参数以及局部变量 , 在出作用域时 , 将自动被释放,栈内存分配运算内置于处理器的指令集中 , 效率 很 高 , 但分配的内存容量有限。
堆:new 分配的内存块 ( 包括数组 , 类实例等 ), 需 delete 手动释放 . 如果未释放 , 在整个程序结束后 ,OS 会帮你回收掉 .
自由存储区:malloc 分配的内存块 , 需 free 手动释放 . 它和堆有些相似 .
全局/静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期内都存在,有编译器在编译的时候分配(数据段(存储全局数据和静态数据)和代码段(可执行的代码/只读常量))。
常量存储区:常量(const)存在此处,此存储区不可修改。
9、栈和堆的区别:
答:管理方式不通:栈是编译器自动管理的,堆是由程序员管理的;
空间大小:在32位OS下,堆内存可达到4GB的空间,而栈内存就很小
能否产生碎片不同:对于栈来说,进栈/出栈都有严格的顺序(先进后出),不会产碎片,而堆频繁的new/delete,会造成内存空间的不连续,容易产生碎片;
生长方向不同:栈向下生长,以降序分配内存地址;堆向上生长,以升序分配内存地址;
分配方式不同:堆动态分配,无静态分配;栈分为静态分配和动态分配,比如局部变量的分配,就是动态分配
分配效率不同:栈是操作系统提供的数据结构,计算机在底层对栈提供支持,进栈和出栈都是有专门的指令,这就决定的栈的效率高,堆则不然,它由C/C++函数库提供,机制复杂,所以堆的效率要比栈低的多;
10、 在c++程序中调用被C编译器编译后的函数,为什么要加extern“C”?
答:C++支持函数重载,C语言不支持函数重载,函数被C++编译器后在库中的名字与C语言的不同;
假设某个函数原型为:
void foo(int x,int y)
该函数被C编译器编译后在库中的名字为: _foo
而C++编译器则会产生像: _foo_int_int 之类的名字。
为了解决此类名字匹配的问题,C++提供了C链接交换指定符号 extern “C”。
11、深拷贝和浅拷贝的区别?
答:深拷贝和浅拷贝可以简单的理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,如果资源重新分配了就是深拷贝;反之没有重新分配资源,就是浅拷贝。
12、什么是野指针?
答:野指针不是NULL指针,是未初始化或者未清零的指针,它指向的内存地址不是程序员所期望的,可能指向了受限的内存
成因:
1)指针变量没有被初始化
2)指针指向的内存被释放了,但是指针没有置NULL
3)指针超过了变量了的作用范围,比如b[10],指针b+11
13、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值