图像算法工程面试所做的准备——C++基础篇

在面试过程中遇到C++相关的问题,有的也是网上搜索的总结,有的贴出原文链接,有的没有贴

1、虚函数和纯虚函数的区别:

 

答:虚函数为了重载和多态的需要,在基类中是有实现的,virtual void Eat(){……};所以子类中可以重载也可以不重载基类中的此函数   

纯虚函数就是基类只定义了函数体,没有实现过程,定义方法如: virtual void Eat() = 0; 纯虚函数相当于Java中的接口,自己不去实现,需要子类来实现函数定义;带纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重载其虚函数后,才能使用。这样的类也叫抽象类。

2、内联函数和宏定义的差别是什么:

1)内联函数在编译时展开,宏在预编译时展开;

  (2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;

  (3)内联函数有类型检测、语法判断等功能,而宏没有;

  (4)inline函数是函数,宏不是;

3、重载、继承、多肽都有什么区别:

函数重载:函数名相同,参数不同

对于重载的多个函数来说,其函数名都是一样的,为了加以区分,在编译连接时,C++会按照自己的规则篡改函数名字,这一过程为"名字改编".有的书中也称为"名字粉碎".不同的C++编译器会采用不同的规则进行名字改编

也有运算符重载,实现运算符的加减乘除;

继承:子类可以具有父类的特性,就是继承;但是基类中私有成员无法被继承。

一个派生类继承了所有的基类方法,但下列情况除外:

基类的构造函数、析构函数和拷贝构造函数。

基类的重载运算符。

基类的友元函数(我们说过友元函数不是成员函数)。

有三种继承方式:

公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员(指的是函数)来访问。

保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。(注意:公有成员也变成了保护成员)

私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。(一般都不会使用这种)

封装:

封装的思想就是将实现的细节隐藏,而暴露公有接口;

C++中的访问标识符,可以实现在类中的封装;通常是将所有的成员变量私有化

尽管看起来访问成员变量的不直接,但使程序更有可重用性和可维护性;

B)隐藏了类的实现,类的使用者只需知道公共的接口,就可以使用该类;

C)封装帮助防止意外的改变和误用;

D)对程序调试有很大的帮助,因为改变类的成员变量只用通过公共接口。

封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用,而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

多态:指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性(也叫静态联编),运行时多态性(动态联编)。 

C++支持两种形式的多态性。第一种是编译时的多态性,称为静态联编。第二种是运行时的多态性,也称为动态联编。运行时的多态性是指必须在运行中才可以确定的多态性,是通过继承和虚函数来实现的。
  a、编译时多态性:通过重载函数实现   采用早绑定:就是在编译时确定对象调用的函数的地址(一般运用于重载)函数多态性
  b、运行时多态性:通过虚函数实现。  采用迟绑定:就会在运行时再去确定对象的类型以及正确的调用函数类的多态性在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数,此为多态的表现;)( 动态联编要求派生类中的虚函数与基类中对应的虚函数具有相同的名称、相同的参数个数和相同的对应参数类型、返回值或者相同,或者都返回指针或引用,并且派生类虚函数所返回的指针或引用的基类型是基类中虚函数所返回的指针或引用的基类型的子类型。如果不满足这些条件,派生类中的虚函数将丢失其虚特性,在调用时进行静态联编。参考:http://blog.csdn.net/neiloid/article/details/6934129

4、预处理和链接库:

答:一个C++程序一般需要经过以下几个步骤才能成为可执行程序:

C++源程序——》编译器预处理——》编译程序——》优化程序——》汇编程序——》链接程序——》可执行程序

编译器预处理:C++编译器自带预处理器,在程序编译之前,由预处理器对C++源程序完成预处理工作。

预处理主要将源程序中的宏定义指令、条件编译指令、头文件包含指令以及特殊符号完成相应的替换工作。

编译程序:以预编译的输出作为输入,利用C++运行库,通过词法分析和语法分析,

在确认所有的指令都符合语法规则时,将其翻译成等价的中间代码表示或者是汇编语言。

优化程序:优化阶段一部分是对中间代码的优化,这种优化不依赖具体的计算机,同机器的硬件环境无关。另一种优化则主要针对目标代码的生成而进行的。对于前一种优化,主要的工作是删除公共表达式、循环优化(循环展开,自动向量化、循环不变量代码移动)以及无用赋值的删除等。

另一种优化同机器的硬件结构密切相关。最主要的是考虑如何充分利用机器的各个硬件寄存器存放有关的变量的值,以减少对于内存的访问次数。

汇编程序:汇编阶段的主要工作是将经过编译、优化后的,以汇编语言的形式存在的程序转化为机器可识别的二进制代码,从而得到相应的目标文件。

链接程序:经历了汇编之后的程序是后缀为.obj形式的文件,仍然是不可执行的,只有经过链接阶段,程序所引用的外部文件关联起来之后,形成.exe后缀的文件之后,才是可执行的。程序中可能引用了定义在其他外部文件中的变量或者函数,比如某些库函数,而链接阶段所做的主要事情就是将这些相关联的文件链接起来,使得所有这些目标文件成为一个能够被操作系统装入执行的统一的整体。

 

动态链接:采用该链接方式表明,需要链接的代码是存放在动态链接库或者某个共享对象的目标文件。

静态链接:采用该链接方式,需要链接的代码会被链接程序从相应的静态链接库中拷贝到可执行程序之中。

5、c++多态底层实现原理

编译器在编译的时候,发现类中有虚函数,此时编译器会为每个包含虚函数的类创建一个虚表(即vtable),该表是一个一维数组,在这个数组中存放每个虚函数的地址。对于基类类都包含了一个虚函数breathe(),因此编译器会为这两个类都建立一个虚表,(即使子类里面没有virtual函数,但是其父类里面有,所以子类中也有了)如下图所示:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值