C++面试准备

it2023-02-20  78

栈,堆区别

malloc/free与new/delete的区别

delete与 delete []区别

常量: C++里是怎么定义常量的?常量存放在内存的哪个位置? 对于局部常量,存放在栈区;对于全局常量,编译期一般不分配内存,放在符号表中以提高访问效率;字面值常量,比如字符串,放在常量区。

浅拷贝,深拷贝 联系 多个对象销毁时 析构函数调用顺序 浅拷贝:简单的赋值 深拷贝:在堆区重新开辟一块内存 浅拷贝可能会造成堆区内存重复释放

p1这个对象有个成员变量是是在堆区开辟的,p2拷贝了p1,在释放内存时,由于p2先调用析构函数,释放了堆区的内存,p1之后还要调用析构函数,释放堆区内存,但此时堆区内存已经被 p2释放过了,这就造成了 堆区内存重复释放 。 编译器提供的构造函数出了问题

怎么解决: 利用深拷贝解决 在重新开辟一个堆区,使得p2指向新的堆区;(重新写一个拷贝构造函数)

如果有 成员变量在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

4. 函数指针 和 指针函数 指针函数 函数指针 定义: 指针函数 类型说明符 * 函数名(参数)

函数指针:

区别: 看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数

**5. **

虚函数和多态

使用了虚函数,会增加访问内存开销,降低效率

重载,重写区别

静态函数 和 虚函数的区别

Vector常用操作

值传递,引用传递区别

指针 引用

const const修饰成员函数的目的是什么? const修饰的成员函数表明函数调用不会对对象做出任何更改,事实上,如果确认不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。

const 与 #define 的比较 ,const有什么优点

static (1)静态成员变量的特点 类内进行声明,类外进行初始化 静态成员

(2)静态成员函数的特点 静态成员函数只能访问静态成员变量 静态成员函数没有 this形参 ?? static成员函数既可以在类的内部定义,也可以在类的外部定义,在外部定义时,不能重复指定static保留字 ??

15. 结构与联合有和区别?

16. 内存泄漏,内存越界

定义: 内存溢出,申请不到足够的内存;

内存泄露,无法释放已申请的内存;

**二者关系:**内存泄露 → 剩余内存不足 → 后续申请不到足够内存 →内存溢出。

原因:

解决:

STL 底层实现?

共享内存

进程,线程 进程,线程 看了一遍排在前面的答案,类似”进程是资源分配的最小单位,线程是CPU调度的最小单位“这样的回答感觉太抽象,都不太容易让人理解。

做个简单的比喻:进程=火车,线程=车厢

20. 死锁 死锁讲解得非常好,一起学习啦 是什么? 死锁: 进程死锁的简称

原因? 产生死锁的四个必要条件为 (1)互斥条件 (2)不可剥夺条件 (3)请求与保持条件 (4)循环等待条件。

(1) 互斥条件:一个资源每次只能被一个进程使用。 (2) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (3) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

解决办法: 一共有三个方法:预防,避免,检测与恢复三种 预防

回答

1、栈,堆区别

2、 重载,重写区别 重载,多态,虚函数,纯虚函数

重载: 编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

重写: 和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

3、 拷贝构造

4、 Vector常用操作

5、 进程,线程

6、值传递,引用传递区别 值传递 :将实参的副本 传给形参 形参改变,不会改变实参。 副本拷贝消耗系统资源

引用传递: 将实参的内存地址传递给形参,因此形参的改变会影响实参。 7、引用 申明和使用“引用”要注意哪些问题 引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。

8、malloc/free与new/delete的区别 相同点:都可用于申请动态内存和释放内存 不同点: (1)操作对象有所不同。 malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。

(2)用法上也有所不同 int *p = (int *) malloc(sizeof(int) * length); int *p2 = new int[length];

9、delete与 delete []区别

引用与指针有什么区别?

10、const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer); 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改; 修饰成员函数,说明该成员函数内不能修改成员变量。 const 的指针与引用 指针 指向常量的指针(pointer to const) 自身是常量的指针(常量指针,const pointer) 引用 指向常量的引用(reference to const) 没有 const reference,因为引用本身就是 const pointer

11、结构与联合有和区别? (1). 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。

(2). 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

12、引用与指针有什么区别?

引用必须被初始化,指针不必。

引用初始化以后不能被改变,指针可以改变所指的对象。

不存在指向空值的引用,但是存在指向空值的指针

13、const 与 #define 的比较 ,const有什么优点? (1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。

(2) 有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试

14、STL 底层实现?

15、共享内存

16、内存 栈:由 编译器 在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

全局存储区(静态存储区):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。

常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。

最新回复(0)