C++面试题

1、指针的优点和缺点

优点:灵活高效

(1)提高程序的编译效率和执行速度(数组下标往下移时,需要使用乘法和加法,而指针直接使用++即可)

(2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯。

(3)可以实现动态的存储分配。

(4)便于表示各种数据结构,如结构体,编写高质量的程序。

缺点:容易出错

(1)可能变成野指针,导致程序崩溃

(2)内存泄露

(3)可读性差

2、指针和引用的定义和区别

(1)指针和引用的定义

1)指针:指针是一个变量,存储一个地址,指向内存的一个存储单元;

2)引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。

(2)指针和引用的区别

<1> 从内存分配上来说:

1)指针是一个实体,而引用仅是个别名,即为指针分配内存,而不为引用分配内存空间;

<2> 从指向的内容来说:

2)引用只能在定义时被初始化一次,之后不可变;指针可变;

3)引用不能为空,指针可以为空;

4)const与指针搭配可以表示指针指向指针指向内容是否可变。const与引用搭配只有一种,即来修饰其内容的可读性。由于引用从一而终,不用修饰其指向。

5)指针可以有多级,但是引用只能是一级(int **p;合法,而int &&a是不合法的)

<3> 其他方面

6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

7)指针和引用的自增(++)运算意义不一样;

指针和引用在符号表中的形式:程序在编译时分别将指针和引用添加到符号表上。在符号表上记录的是变量名及变量所对应地址。在符号表上,指针变量对应的地址值为指针变量的地址值,而引用对应的地址值是引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。

3、malloc/free 和 new/delete相关的面试题

1):C++有了malloc/free 为什么还要new/delete?

(1)malloc/free只在申请空间时,它们只需要申请空间,无法对空间进行操作。

(2)而在创建C++的对象时,不仅仅是需要申请空间,还需要自动调用构造函数,以及在对象消亡之前要自动执行析构函数。

因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete

根据上面两点,我们可以知道malloc/free 是不能满足C++的需要的,因此需要new/delete。

即在创建对象时,能分配内存空间且初始化内存 + 销毁对象时,能回收空间且对内存进行清理的new/delete。

2)为什么malloc/free在申请空间时,它们只能申请空间,无法对空间进行操作?

因为:malloc/free 是库函数,使用它需要头文件,在一定程度上是独立于语言的。编译器在处理库函数时,编译器不需要知道它是做啥的,而仅仅需要对该函数进行编译,并且保证调用函数时的参数和返回值是合法的,并生成相应 call 函数的代码就ok了。编译器不会控制库函数做一些操作,比如调用构造函数和析构函数。因此malloc/free无法满足动态生成对象的要求。

3)为什么new/delete 在申请空间时,它们不仅能申请空间,还能调用构造函数或析构函数对对空间进行操作?

因为:new/delete是运算符,它与+-*/的地位 是一样的。编译器看到new/delete时,就知道只要它要做啥操作,并生成对应的代码。

4):malloc/free  和 new/delete 的相同点和不同点

相同点:它们都可以申请和释放空间。

不同点:

一、new/delete 在申请空间的时候能对空间进行操作,而malloc/free 不能。

(1)new :分配内存 + 调用类的构造函数 + 初始化  delete:释放内存 + 调用类的析构函数

(2)malloc:只分配内存,不会进行初始化类成员的工作   free只释放内存,不会调用析构函数

二、new/delete是C++运算符,能重载

(1)new、delete 是运算符,可以进行重载

(2)malloc,free是标准库函数,不可以进行重载,但可以覆盖。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值