您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > C和C++常见面试题
C/C++结构与联合有和区别?•struct和union都是由多个不同的数据类型成员组成,但在任何同一时刻,union中只存放了一个被选中的成员,而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。•对于union的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于struct的不同成员赋值是互不影响的。结构体是多个数据的集合,可以保存多个数据;而联合union只保存一个数据,但是可以按照不同类型来读取。•比如你的联合里面有一个int和一个float,你第一次写进int,然后第二次写进float,那么int就不可用了(或者说读出来已经不是你存的int值了),因为这个union所在的内存区域值已经是第二次写进的float了。面向对象的三个基本特征,并简单叙述之?•继承:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并它允许程序员在保持原有类特性的基础上进行扩展,增加功能,使之更适合特殊的需要。•封装:封装(Encapsulation)是面向对象程序设计最基本的特性,把数据(属性)和函数(方法)合成一个整体,对数据的访问只能通过公有的接口访问,封装的对象,这些对象通过一个受保护的接口访问其他对象。•多态性:多态性(polymorphism)多态性是指允许不同类的对象对同一消息作出响应。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题,函数的重载,运算符的重载,属于多态性中的编译时的多态性,虚函数属于运行时多态。ISO的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?•应用层表示层会话层传输层网络层物理链路层物理层•TCP/UDP属于传输层•TCP是面向连接的可靠字节流•UDP是无连接的不可靠报文传递•TCP服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。•与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。•由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。•TCP:提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好,开销大,实时性较差。UDP:包头小,开销小,占用资源少,实时性较好,缺点是不可靠。请解释“func”为何种类型,这种类型的作用什么,变量ttt的值是多少?•typedefint(*func)(int,int*);•intxxx(inta,int*p)•{•returna+*p;•}•intdowork(funcaaa,intbbb,int*ccc)•{•returnaaa(bbb,ccc);•}•intsss=4;•intttt=dowork(&xxx,3,&sss);func表示一个函数指针,它指向参数为int,int*,返回值为int的函数。ttt的值为7请解释下面代码采用了何种C++特性(C语言不具备),作用是什么?•templatetypenameT•Tsum(Ta,Tb)•{•return(a+b);•}•表示函数模板,用于将一类功能相同,参数类型和返回值不同的函数抽象为一个模板,方便模板函数调用。newdelete和mallocfree的区别与联系?•malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都用于在堆(heap)上进行动态的内存操作(申请动态内存和释放内存)。•delete不仅会释放空间,在释放前会调用析构函数,和new对应,new调用构造函数,free只会释放内存。•对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。•C++程序经常要调用C函数,其实new/delete内部实现也调用了malloc/free。而C程序只能用malloc/free管理动态内存•new是强制类型的,不需要考虑类型,而malloc不是,它返回的指针是void*型,必须要强转成需要的类型。(注意)•new可以调用构造函数在声明的时候初始化,malloc只是分配空间,需要在其他地方初始化。而且malloc需要指定分配空间大小,而new是自动计算的。•new/delete是可以重载的,而重载之后,就成为了函数。当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。•free和delete可以释放NULL指针。C++中的class和struct的区别•从语法上,在C++中(只讨论C++中)。class和struct做类型定义时只有两点区别:•默认继承权限:class的继承按照private继承处理,struct的继承按照public继承处理。•成员的默认访问权限:class的成员默认是private权限,struct默认是public权限。几种内存分配方式以及它们的区别•从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。•在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令。•从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?•重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。•重写:是指子类重新定义父类虚函数的方法。•从实现原理上来说:•重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。对于这类函数的调用,在编译期间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!•重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)多态的作用?•隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;•接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。类成员函数的重载、覆盖和隐藏的区别?•①成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。•②覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。•③“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆);(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。C++中的空类,默认产生的类成员函数•class•{•public:•Empty();//缺省构造函数•Empty(constEmpty&);//拷贝构造函数•~Empty();//析构函数•Empty&operator=(constEmpty&);//赋值运算符•Empty*operator&();//取值运算符•constEmpty*operator&()const;//取值运算符const•};进程间通信的方式有?•进程间通信的方式有:共享内存,管道(有名管道/无名管道),Socket,消息队列,信号,信号量,内存映射等。类的静态成员和非静态成员有什么区别?•类的静态成员每个类只有一个,即是属于本类的;类的非静态成员每个对象都有一份。什么是浅拷贝?什么是深拷贝?•浅拷贝:使用类自身默认的拷贝构造函数和赋值运算符函数所完成的工作就是浅拷贝,浅拷贝的本质就是类的数据成员之间的字节的逐一赋值。在一般情况下浅拷贝是能够完成工作的,但是如果类里面的数据成员有指针类型的东西,就不可以工作,会引发内存的崩溃。•深拷贝:使用用户自己定义的拷贝构造函数和赋值运算符函数来完成工作。当类里面含有指针类型的成员变量的时候必须使用深拷贝来完成工作,其本质是对于基本的数据类型做的是字节的逐一赋值,但是对于指针类型的变量它会单独的开辟一段内存,从而解决了由浅拷贝引起的指针悬挂问题。•概念要记得,代码要会写。那些情况需要调用拷贝构造函数,请举例?•a.一个对象以值传递的方式传入函数体•b.一个对象以值传递的方式从函数返回•c.一个对象需要通过另一个对象进行初始化C和C++有什么不同?•①从机制上:c是面向过程的(但c也可以编写面向对象的程序);c++是面向对象的,提供了类。但是,c++编写面向对象的程序比c容易•②从适用的方向:c适合要求代码体积小的,效率高的场合,如嵌入式;c++适合更上层的,复杂的;linux核心大部分是c写的,因为它是系统软件,效率要求极高。•③C语言是结构化编程语言,C++是面向对象编程语言。C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。C++中virtual与inline的含义分别是什么?•在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。•inline与函数的定义体放在一起,使该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。•虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。•内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么•传值,传指针或者引用•采用引用的方式在多态中进行传参•原因:使用引用可以节省空间和时间,用于对象时不用调用拷贝构造函数产生参数副本,可以调高效率,直观,安全。C++和C定义结构的分别是什么。•C语言的结构仅仅是数据的结合,不可以定义方法。•C++的struct和class其实具备几乎一样的功能,只是默认的访问属性不一样而已。构造函数可否是虚函数,为什么?析构函数呢,可否是纯虚的呢?•构造函数不能为虚函数,要构造一个对象,必须清楚地知道要构造什么,否则无法构造一个对象。•析构函数可以为纯虚函数。TCP/IP建立连接的过程•在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。•第一次握手:建立连接时,客户端发送连接请求到服务器,并进SYN_SEND状态,等待服务器确
本文标题:C和C++常见面试题
链接地址:https://www.777doc.com/doc-1394647 .html