首页 > 编程语言 >第二章:10道C/C++经典面试题

第二章:10道C/C++经典面试题

时间:2022-12-09 16:05:31浏览次数:38  
标签:10 面试题 函数 C++ 链表 重载 重写 构造函数


面试题11:设置地址为 0x67a9 的整型变量的值为 0xaa66

int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;

说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。



面试题 12:面向对象的三大特征


面向对象的三大特征是封装性、继承性和多态性:


 封装性:将客观事物抽象成类,每个类对自身的数据和方法实行 protection(private, protected,public)。


 继承性:广义的继承有三种实现形式:实现继承( 使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。


 多态性:是将父类对象设置成为和一个或更多它的子对象相等的技术。用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。(通过virtual来实现)


说明:面向对象的三个特征是实现面向对象技术的关键,每一个特征的相关技术都非常的复杂,程序员应该多看、多练。



面试题 13:C++的空类有哪些成员函数


 缺省构造函数。

 缺省拷贝构造函数。

 缺省析构函数。

 缺省赋值运算符。

 缺省取址运算符。

 缺省取址运算符 const。

注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。



面试题 14:谈谈你对拷贝构造函数和赋值运算符的认识


拷贝构造函数和赋值运算符重载有以下两个不同之处:

(1)拷贝构造函数生成新的类对象,而赋值运算符不能。


(2)由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉


注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。



面试题 15:用 C++设计一个不能被继承的类



template <typename T> class A
{
friend T;
private:
A() {}
~A() {}
};
class B : virtual public A<B>
{
public:
B() {}
~B() {}
};
class C : virtual public B
{
public:
C() {}
~C() {}
};


注意:构造函数是继承实现的关键,此处父类的构造函数设置为private。   每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的。


面试题 16:访问基类的私有虚函数


写出以下程序的输出结果:


#include <iostream>
using namespace std;
class A
{
virtual void g()
{
cout << "A::g" << endl;
}
private:
virtual void f()
{
cout << "A::f" << endl;
}
};

class B : public A
{
void g()
{
cout << "B::g" << endl;
}
virtual void h()
{
cout << "B::h" << endl;
}
};

typedef void(*Fun) (void);

int _tmain(int argc, _TCHAR* argv[])
{
B b;
Fun pFun;
for (int i = 0; i < 3; i++)
{
pFun = (Fun)*((int*)* (int*)(&b) + i);
pFun();
}
}

输出结果:

B::g

A::f

B::h

注意:本题主要考察了面试者对虚函数的理解程度。一个对虚函数不了解的人很难正确的做出本题。在学习面向对象的多态性时一定要深刻理解虚函数表的工作原理。



面试题 17:简述类成员函数的重写、重载和隐藏的区别

(1)重写和重载主要有以下几点不同。


 范围的区别:被重写的和重写的函数在两个类中,而重载和被重载的函数在同一个类中。

 参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同。

 virtual 的区别:重写的基类中被重写的函数必须要有 virtual 修饰,而重载函数和被重载函数可以被virtual 修饰,也可以没有。

(2)隐藏和重写、重载有以下几点不同。


 与重载的范围不同:和重写一样,隐藏函数和被隐藏函数不在同一个类中。

 参数的区别:隐藏函数和被隐藏的函数的参数列表可以相同,也可不同,但是函数名肯定要相同。当参数不相同时,无论基类中的参数是否被 virtual 修饰,基类的函数都是被隐藏,而不是被重写。

说明:虽然重载和覆盖都是实现多态的基础,但是两者实现的技术完全不相同,达到的目的也是完全不同的,覆盖是动态态绑定的多态,而重载是静态绑定的多态。



面试题 18:简述多态实现的原理


编译器发现一个类中有虚函数,便会立即为此类生成虚函数表 vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针 vptr(对 vc 编译器来说,它插在类的第一个位

置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行 vptr 与 vtable 的关联代码,将 vptr 指向对应的 vtable,将类与此类的 vtable 联系了起来。另外在调用类的构造函数时,

指向基础类的指针此时已经变成指向具体的类的 this指针,这样依靠此 this 指针即可得到正确的 vtable。如此才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。

注意:一定要区分虚函数,纯虚函数、虚拟继承的关系和区别。牢记虚函数实现原理,因为多态是C++面试的重要考点之一,而虚函数是实现多态的基础。



面试题 19:链表和数组有什么区别


数组和链表有以下几点不同:

(1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。

(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。

(3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。

(4)越界问题:链表不存在越界问题,数组有越界问题。

说明:在选择数组或链表数据结构时,一定要根据实际需要进行选择。数组便于查询,链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。



面试题 20:怎样把一个单链表反序

(1)反转一个链表。循环算法。


List reverse(List n)

{

if(!n) //判断链表是否为空,为空即退出。

{

return n;

}

list cur = n.next; //保存头结点的下个结点

list pre = n; //保存头结点

list tmp;

8

pre.next = null; //头结点的指针指空,转换后变尾结点

while ( NULL != cur.next ) //循环直到 cur.next 为空

{

tmp = cur; //实现如图 10.3—图 10.5 所示

tmp.next = pre

pre = tmp;

cur = cur.next;

}

return tmp; //f 返回头指针

}


(2)反转一个链表。递归算法。


List *reverse( List *oldList, List *newHead = NULL )

{

List *next = oldList-> next; //记录上次翻转后的链表

oldList-> next = newHead; //将当前结点插入到翻转后链表的开头

newHead = oldList; //递归处理剩余的链表

return ( next==NULL )? newHead: reverse( t, newHead );

}

说明:递归算法的设计虽有一点难度,但是理解了循环算法,再设计递归算法就简单多了。



标签:10,面试题,函数,C++,链表,重载,重写,构造函数
From: https://blog.51cto.com/u_15907770/5926129

相关文章

  • C++猜数字游戏的程序,用srand()函数产生随机数
    /*编写一个猜数字游戏的程序:程序随机选择一个1到1000的数,然后输出:  Ihaveanumberbetween1and1000.    Canyouguessmynumber?  Pleasetype......
  • C语言中的结构体与C++中的类异同
    从C语言到C++,是编程思想的进步,技术发展的结果吧,所以C++基本上是兼容C的语法的,C++的很多东西也是从C中继承过来的,然后再发扬,C语言的结构体便是C++中类的雏形。       ......
  • MFC,VC++中,CView类意外消失
    (1)在我们写MFC程序的时候,可能CView类可能会意外的消失,现在我用的是Win7操作系统,VC6.0和WindowsXP是完全兼容的,可能是系统兼容的问题,所以在Win7系统下编写程序总会出现一些莫......
  • MFC,VC++计算器小程序
    大学期末没课,某个中午闲来无聊,正好在自学MFC,于是想用MFC、C++写点东西,由于能力有限,当然的写个简单点的啦,于是花了两个小时写了这个计算器的小程序,希望对初学VC++和MFC的朋友有所帮助。程......
  • 冒泡排序算法详解C++程序
    (1)冒泡排序算法:(BubbleSort)首先肯定是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到......
  • sklearn学习笔记10:线性回归
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 《安富莱嵌入式周报》第294期:将C/C++代码转换为各种高级语言,超炫渲染着色器,VS2022新闻
    往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104更新视频教程:USB应用实战视频教程第5期:手把手玩转USBHID免驱方式......
  • C++那些事-static
    static那些事关于作者微信公众号:当与不同类型一起使用时,Static关键字具有不同的含义。我们可以使用static关键字:静态变量:函数中的变量,类中的变量静态类的成员:类对......
  • ASEMI电磁炉整流桥KBJ2510参数和性能
    编辑-ZASEMI电磁炉整流桥KBJ2510参数和性能怎么样呢?ASEMI采用波峰的GPP大芯片,工艺制造,稳定性高,抗冲击性强。KBJ2510具体参数为:正电流:25A,反向耐压:1000V,反向电流:10uA,正向压......
  • Win10 安装 Linux子系统
    1、win+S,搜索PowerShell,右键管理员身份运行 2、输入命令,启用 适用于Linux的Windows子系统 功能dism.exe/online/enable-feature/featurename:Microsoft-Wi......