2022年完整word版,c++经典面试题 .pdf
1 1. C 和 C+ 中 struct 有什么区别?C 语言中: Struct 是用户自定义数据类型(UDT)C+语言中:Struct 是抽象数据类型( ADT),支持成员函数的定义。在 C+中, struct 的成员的默认访问说明符为public, class 为 private 。c 中的 struct 是没有权限设置的。C+中 struct 增加了访问权限 ,且可以和类一样有成员函数。C+中的 struct 等同于 class, 只是 class 默认成员权限是 private, 而struct 默认成员权限是 public。1 C+ 中的 struct 类似于 class,有变量,有构造函数、虚函数等,有继承,多态等类的特征;2 2 C 中的 struct只有变量,不能有函数,但是可以有函数指针2.C+ 中的 struct 和 class 有什么区别?在 C+ 中,两者区别不大,但是有2 个主要的区别1. 继承权限: struct 默认是 public继承; class 默认是 private继承精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 30 页2 2. 访问权限: struct 默认是 public访问; class 默认是 private访问3.如何判断一段程序是由C 编译程序还是由C+ 编译程序编译的?【标准答案】#ifdef _cplusplus cout“ c+; #else cout c 语言 部分;精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 30 页4 2 面向对象部分,包括封装、继承、多态这些C 语言所没有的特性;3 泛型编程部分,大多数类、函数要考虑到把它设计成模板,方便复用;4 STL 库,里面封装了大量的优秀模板,是3 中内容的集成,学会使用它们可以让代码更高效。当然,最好去深入了解STL源码,那样会对 C+ 有更深的理解。5. “ 引用”与指针的区别是什么?【参考答案】指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。在另一本 C+ 著作More Effective C+ 里,第一条就是论述point 和 reference的区别总结一下,1 指针是一个存储地址的变量,而引用是一个变量的别名。所以在一个函数中,传引用要比传指针速度更快。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 30 页5 2 指针可以指向一个空值,而引用必须初始化。指针可以如下形式出现cppview plaincopy1. int *p; 是合法但不合理的 (相当于是一个野指针 ) 。可以声明一个指向空值的指针cppview plaincopy1. int *p=null 而引用不行cppview plaincopy1. int &r; 是错误的引用必须初始化为一个变量的别名,如cppview plaincopy1. int a=5; 2. int &r=a; 3 也是因为 2的特性,指针在使用前要判断是否为空,而引用必定不为空(否则会报错 ),所以不用判断。4 指针可以更改指向的内存地址,而引用是和变量绑定的, 不可更改。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 30 页6 5 在运算符重载过程中,通常返回一个引用往往比返回一个指针更好,使用指针易引起语义上的歧义。6.class A virtual void func1();void func2(); ;class B: class A void func1()cout fun1 in class B endl; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 30 页7 virtual void func2()cout fun2 in class B 65536 ) 3. 4. cout32 bitendl; 5. 6. else 7. 8. cout16 bit/2生命周期不同:全局变量随主程序创建而创建,随主程序销毁而销毁;内存中分配在全局数据区。局部变量在局部函数内部, 甚至局部循环体等内部存在, 退出就不存在;分配在栈区。使用方式不同:通过声明后全局变量程序的各个部分都可以用到;精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 30 页20 局部变量只能在局部使用;3操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面。另,全局变量会被初始化为0,而局部变量以随机值进行初始化31.Heap 与 stack 的差别【参考答案】Heap 是堆, stack 是栈。Stack 的空间由操作系统自动分配/ 释放, Heap 上的空间手动分配 / 释放。Stack 空间有限, Heap 是很大的自由存储区C 中的 malloc函数分配的内存空间即在堆上,C+ 中对应的是 new 操作符。程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 20 页,共 30 页21 32.In C+, what does explicit mean? what does protected mean? 【标准答案】c+ 中的 explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,在某些情况下,我们要求类的使用者必须显示调用类的构造函数时就需要使用explicit, 反之默认类型转换可能会造成无法预期的问题。protected控制的是一个函数对一个类的成员(包括成员变量及成员方法)的访问权限。 protected成员只有该类的成员函数及其派生类的成员函数可以访问。我擦!它俩为啥放在一起问。33.重复多次 fclose 一个打开过一次的FILE *fp 指针会有什么结果,并请解释。【参考答案】 考察点:导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。34.为什么数组名作为参数, 会改变数组的内容, 而其它类型如int 却不会改变变量的值?【参考答案】当数组名作为参数时,传递的实际上是地址。而其他类型如 int 作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对形参的改变并不影响实参的值。传值与传地址的区别精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 21 页,共 30 页22 35.你觉得如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?【参考答案】(1)程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。(2)在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。(3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。36.为什么需要使用堆,使用堆空间的原因?【参考答案】 直到运行时才知道一个对象需要多少内存空间;不知道对象的生存期到底有多长。因为需要动态分配内存啊。37. const关键字?有哪些作用【参考答案】 const 关键字至少有下列n 个作用:(1) 欲阻止一个变量被改变, 可以使用 const 关键字。在定义该 const变量时,通常需要对它进行初始化, 因为以后就没有机会再去改变它了;(2)对指针来说,可以指定指针本身为const ,也可以指定指针所指精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 30 页23 的数据为 const ,或二者同时指定为const ;(3)在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(这样既可以利用传地址、 传引用的高效特性, 又保证了传值的安全性)(4)对于类的成员函数,若指定其为const 类型,则表明其是一个常函数,不能修改类的成员变量;还记得如果要修改成员变量,应该把成员变量声明为什么吗?mutable !(5)对于类的成员函数,有时候必须指定其返回值为const 类型,以使得其返回值不为 “左值 ”。更多更详细的内容,推荐看Effective C+38.、是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加 virtual , 也能实现多态 ? 【参考答案】 virtual修饰符会被隐形继承的。virtual可加可不加。子类的空间里有父类的所有变量(static 除外 )。同一个函数只存在一个实体(inline 除外 )。子类覆盖它的函数不加virtual , 也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。不过最好是加上,加上表明它是一个虚函数,这样提高了代码的阅读性。39.面向对象的三个基本特征,并简单叙述之?【参考答案】精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 30 页24 1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public) 2. 继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合= 接口继承以及纯虚函数)构成了功能复用的两种方式。3. 多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。40.重载( overload) 、重写 (override ,有的书也叫做 “覆盖”)、重定义(redefinition)的区别?【标准答案】精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 24 页,共 30 页25 41.多态的作用?【参考答案】主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。42.当一个类 A 中没有声明任何成员变量与成员函数,这时 sizeof(A) 的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。【标准答案】 sizeof(A)= 1;编译器不允许一个类的大小为0, 会为它分配 1 字节的内存。试想,若,不这样做,那2 个类 A 的实例在内存中将会无法区分。43.如果 Class A 中定义并实现虚函数int func(void),Class B 中也实现该函数,那么cppview plaincopy1. A a; 2. a-func() 将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 25 页,共 30 页26 【参考答案】第一问调用的是B 的。第二问调用A 的。虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果。44.C+ 里面是不是所有的动作都是main() 引起的?如果不是, 请举例。【参考答案】比如全局变量的初始化,就不是由main 函数引起的。举例:cppview plaincopy1. class A; 2. A a; /a 的构造函数限执行3. int main() 45. 内联函数在编译时是否做参数类型检查【参考答案】内联函数要做参数类型检查, 这是内联函数跟宏相比的优势。46.请讲一讲析构函数和虚函数的用法和作用?【参考答案】析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。 有适放内存空间的作用。虚函数是 C+ 多态的一种表现 , 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。如果一个类是作为基类存在的,一定要声明一个虚析构函数,否则删除动态分配的子类实例时会出现局部删除 ,造成内存泄露和未知错误精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 26 页,共 30 页27 47. “ new ” in c+ is a:A. library function like malloc in c B. key wordC. operatorD. none of the above 【参考答案】 C。malloc是库函数,不在编译器控制范围之内;new是运算符,在编译器控制范围之内。调用 malloc时,从堆中申请内存;调用 new 时,从堆中申请内存并为内存调用构造函数。48.对于 C+ 中类 (class) 与结构 (struct) 的描述正确的为 : A,类中的成员默认是private的,当是可以声明public,private 和protected,结构中定义的成员默认的都是public; B,结构中不允许定义成员函数,当是类中可以定义成员函数; C,结构实例使用malloc() 动态创建 ,类对象使用 new 操作符动态分配内存; D,结构和类对象都必须使用new 创建 ; E,结构中不可以定义虚函数,当是类中可以定义虚函数. F,结构不可以存在继承关系,当是类可以存在继承关系.【标准答案】 A,D49.两个互相独立的类 :ClassA 和 ClassB,都各自定义了非静态的公有成员函数PublicFunc() 和非静态的私有成员函数PrivateFunc(); 现精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 27 页,共 30 页28 在要在 ClassA 中增加定义一个成员函数ClassA:AdditionalPunction(ClassA a,ClassB b);则可以在AdditionalPunction(ClassAx,ClassB y)的实现部分 (函数功能体内部 )出现的合法的表达是最全的是: A,x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc(); B,x.PrivateFunc();x.PublicFunc();y.PublicFunc(); C,x.PrivateFunc();y.PrivateFunc();y.PublicFunc(); D,x.PublicFunc();y.PublicFunc();【标准答案】 B(主要考察 private 和 public的作用,private下的成员变量和成员函数只能由类本身的成员变量和函数访问,子类不行、其它类更不行)50.C+ 程序下列说法正确的有: A,对调用的虚函数和模板类都进行迟后编译. B,基类与子类中函数如果要构成虚函数,除了要求在基类中用virtual 声明,而且必须名字相同且参数类型相同返回类型相同。C,重载的类成员函数都必须要:或者返回类型不同 ,或者参数数目不同 ,或者参数序列的类型不同. D,静态成员函数和内联函数不能是虚函数,友员函数和构造函数也不能是虚函数 ,但是析构函数可以是虚函数. 【标准答案】 A精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 28 页,共 30 页29 这道题查了不少资料了,各种说法都有,说下我的理解吧,首先,没有继承性的函数都不能是虚函数,因为这样毫无意义。所以,普通函数是不能作为虚函数存在的。A 中,虚函数是动态联编的,但模板类是在编译期间就确定的,迟后编译应该也是动态联编,这样A 应该是错的?!B 中,如果基类中声明一个虚函数,子类函数和基类函数的名字、参数类型、返回类型有任一不同,都将会生成一个新的函数。这样看来,B应该是正确的。C 中,切记,重载的函数之间的不同,不包括返回类型!D 中,静态函数在类中只有一份,被所有对象共享,不存在多态性,自然不能是虚函数;内联函数在编译时直接展开,自然也不能是虚函数;友元函数不是类的成员函数, 不能被继承,故而也不能被声明为虚函数;构造函数不能够被继承,不能是虚函数,并且,构造函数是用来执行初始化的,虚函数是用来实现多态性的。 若尚未构造出来, 如何实现多态?!显然行不通。有些函数是不能作为虚函数的,具体是哪些?作为虚函数的函数,必须是类的成员函数,且具有继承性。1. 非类的成员函数,即普通函数精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 29 页,共 30 页30 它们没有继承性,即便声明为虚函数,也毫无意义。2. 构造函数首先,构造函数是不能够被继承的,自然就不能声明为虚函数其次, 构造函数是用来执行初始化的,虚函数是用来实现多态性的。若尚未构造出来,如何实现多态?!显然行不通。3.静态成员函数类的静态成员函数是不能够继承的,对于拥有它的类,只有一份代码,由该类的所有对象共享。所以也不能是虚函数。4.friend函数(即,友元函数)友元函数不属于类的成员函数,不能够被继承。5.inline函数内联函数在编译时就会展开执行,不具有多态性。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 30 页,共 30 页