好文档 - 专业文书写作范文服务资料分享网站

C++面试宝典

天下 分享 时间: 加入收藏 我要投稿 点赞

C++程序员面试宝典(1)

1.new、delete、malloc、free关系

(1)delete会调用对象的析构函数,new调用构造函数。 Malloc申请内存空间,free只会释放内存。

(2)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。 (3)它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。

(4)对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

(5)都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的destructor,而free 不会调用对象的destructor.

2.delete与 delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。 delete与New配套,delete []与new []配套 MemTest*mTest1=newMemTest[10]; MemTest*mTest2=newMemTest; int*pInt1=newint[10]; int*pInt2=newint;

delete[]pInt1; //-1-

delete[]pInt2; //-2-报错,要使用delete delete[]mTest1;//-3-

delete[]mTest2;//-4-报错,使用delete

这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针。

简单来说,用new分配的内存,用delete删除;用new[]分配的内存,用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

3、继承优缺点

优点:类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。

缺点:

(1)因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。 (2)父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。 如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。 这种依赖关系限制了灵活性并最终限制了复用性。

4、什么是“引用”?申明和使用“引用”要注意哪些问题?

答:引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再

把该引用名作为其他变量名的别名。

声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元,不能建立数组的引用。

5、将“引用”作为函数参数有哪些特点?

(1)传递引用与传递指针的效果是一样的。函数的形参成为主调函数中的实参的一个别名来使用,函数中对形参操作就是对主函数中的实参操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用\指针变量名\的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

6、在什么时候需要使用“常引用”?

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;

而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const 。

7、“引用”与指针的区别是什么?

指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;

而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

8、结构与联合有和区别?

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

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

9、关联、聚合(Aggregation)以及组合(Composition)的区别?

涉及到UML中的一些概念:关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表示has-a的关系,是一种相对松散的关系,聚合类不需要对被聚合类负责,从实现的角度讲,聚合可以表示为:

class A {...} class B { A* a; .....}

而组合表示contains-a的关系,关联性强于聚合:组合类与被组合类有相同的生命周期,组合类要对被组合类负责,实现的形式是:

class A{...} class B{ A a; ...}

10、面向对象的三个基本特征,并简单叙述之?

1. 封装:将客观事物抽象成类,每个类对自身的数据和方法通过修饰符实行保护

2. 继承:广义的继承有三种实现形式:

实现继承(指使用基类的属性和方法而无需额外编码的能力) 可视继承(子窗体使用父窗体的外观和实现代码) 接口继承(仅使用属性和方法,实现滞后到子类实现)。

前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。

3. 多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

11、子类析构时要调用父类的析构函数吗?

析构函数调用的次序:先派生类析构、后基类析构;在基类的的析构调用的时候,派生类的信息已经全部销毁了。

构造函数调用次序:先调用基类的构造函数、后调用派生类的构造函数;

12、重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别? 从定义上来说:

重载:是指允许存在多个同名函数,而这些函数的参数表不同 重写:是指子类重新定义父类虚函数的方法。 从实现原理上来说:

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数。

如:有两个同名函数:function func(integer)和function func(string)。那么编译器做过

C++面试宝典

C++程序员面试宝典(1)1.new、delete、malloc、free关系(1)delete会调用对象的析构函数,new调用构造函数。Malloc申请内存空间,free只会释放内存。(2)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。(3)它们都可用于申请动态内存和释放内存。
推荐度:
点击下载文档文档为doc格式
5qbc91edkm6d7jn4l204
领取福利

微信扫码领取福利

微信扫码分享