50个C语言C++常见面试题及答案

合集下载

c面试试题及答案

c面试试题及答案

c面试试题及答案一、自我介绍你好,我是XXX,很高兴有机会参加C面试。

我具备扎实的编程基础和丰富的项目经验,在此次面试中,我将展示我的能力和潜力。

谢谢!二、C语言基础知识1. 请解释C语言中的指针(pointer)是什么?指针是一种变量,它存储了内存地址。

通过指针,我们可以直接访问和修改内存中的数据。

指针的灵活性使得我们可以在C语言中进行高效的内存管理和操作。

2. 请描述C语言中的动态内存分配的过程及对应的函数。

动态内存分配是在程序运行时按需分配和释放内存的过程。

在C语言中,使用malloc函数动态分配内存,使用free函数释放已分配的内存。

具体分配内存的大小和释放内存的时机需要根据具体需求来决定。

3. 什么是结构体(struct)?如何定义和使用结构体?结构体是一种自定义的数据类型,它可以将不同类型的数据按照一定的组织方式打包在一起。

在C语言中,我们可以使用struct关键字定义结构体,并通过点操作符(.)来访问结构体成员。

4. C语言中的位运算符有哪些,分别用于什么场景?C语言中常用的位运算符有按位与(&)、按位或(|)、按位异或(^),它们用于对二进制数进行位级操作。

位运算可以在一些特定场景中提高程序的运行效率,如位掩码、位标记等。

三、编程题请编写一个C语言程序,实现冒泡排序算法。

```c#include <stdio.h>void bubbleSort(int arr[], int size) {int i, j, temp;for (i = 0; i < size - 1; i++) {for (j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}int main() {int arr[] = {5, 2, 9, 3, 7};int size = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, size);printf("排序结果:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;}```这个程序实现了冒泡排序算法,将数组中的元素按照升序排列,并输出排序结果。

c与c_面试题目(3篇)

c与c_面试题目(3篇)

第1篇第一部分:C语言基础1. 面试题:请解释C语言中的“变量声明”和“变量定义”的区别。

解析:- 变量声明:告诉编译器即将使用一个变量,但不分配存储空间。

它只告诉编译器变量的名称、数据类型和存储类别。

- 变量定义:不仅告诉编译器变量的名称、数据类型和存储类别,还分配存储空间给变量。

```cint i; // 变量声明int i = 10; // 变量定义```2. 面试题:什么是内存泄漏?如何检测和避免内存泄漏?解析:- 内存泄漏:在程序运行过程中,由于疏忽或错误,导致已分配的内存没有被释放,导致内存占用逐渐增加,最终可能耗尽系统内存。

- 检测内存泄漏:可以使用工具如Valgrind、Sanitizer等来检测内存泄漏。

- 避免内存泄漏:- 确保所有分配的内存在使用后都被释放。

- 使用智能指针(如C++中的`std::unique_ptr`、`std::shared_ptr`)来自动管理内存。

```cvoid function() {int ptr = malloc(sizeof(int)); // 分配内存// 使用ptr...free(ptr); // 释放内存}```3. 面试题:请解释C语言中的指针和数组的关系。

解析:- 在C语言中,数组名本身就是一个指向数组首元素的指针。

- 可以通过指针访问数组元素,也可以通过数组下标访问。

```cint arr[10];int ptr = arr; // ptr指向数组的第一个元素int value = (ptr + 5); // 访问数组中索引为5的元素```4. 面试题:请解释C语言中的结构体(struct)和联合体(union)的区别。

解析:- 结构体:可以包含不同数据类型的成员,每个成员都有自己的内存空间。

- 联合体:所有成员共享同一块内存空间,在某一时刻只有一个成员有效。

```cstruct {int a;float b;} s;union {int a;float b;} u;```第二部分:C++基础1. 面试题:请解释C++中的构造函数和析构函数。

c的面试题及答案

c的面试题及答案

c的面试题及答案面试题一:请解释一下C语言的指针和引用的区别。

答案:在C语言中,指针和引用都是用来处理内存地址的。

它们的主要区别在于以下几个方面:1. 定义和使用方式:- 指针是一个变量,存储的是一个内存地址。

通过使用"*"操作符可以获取或修改该地址对应的值。

- 引用则是一个已存在对象的别名。

它在定义时需要和原对象进行绑定,并且无法更改绑定的对象。

2. 空指针和无效引用:- 指针可以被赋值为空指针(NULL)或无效的地址值,表示指针不指向任何有效的内存地址。

- 引用必须在定义时进行初始化,并且必须引用一个有效的对象。

3. 内存管理:- 指针需要显式地通过动态内存分配函数(如malloc())进行内存的分配和释放。

- 引用的内存管理则由编译器自动处理,无需手动管理。

4. 数组和函数的传递:- 指针可以用于处理数组或者作为函数的参数进行传递。

- 引用可以作为函数参数,但无法直接用于处理数组。

面试题二:请解释C语言中的堆和栈的区别。

答案:在C语言中,堆和栈是两种不同的内存分配方式,具有以下区别:1. 分配方式:- 栈是由编译器自动分配和释放的,它的空间有限,大小在编译时就已经确定。

- 堆是由程序员手动分配和释放的,它的空间相比栈更大,并且大小在运行时可动态调整。

2. 内存结构:- 栈的数据结构为“先进后出”的方式,即后进栈的数据先出栈。

- 堆则没有明确的数据结构,按照动态分配顺序分配内存。

3. 分配效率:- 栈的分配和释放速度要快于堆,因为栈只需要移动栈顶指针即可。

- 堆的分配和释放速度相对较慢,因为需要在运行时进行内存的动态分配和回收。

4. 使用方式:- 栈主要用于存储局部变量、函数调用和函数参数等数据。

- 堆主要用于存储动态分配的内存,如通过malloc()函数分配的内存块。

面试题三:请解释C语言中的宏定义和常量的区别。

答案:在C语言中,宏定义和常量都可以用来表示不可更改的值,但它们的区别如下:1. 定义方式:- 宏定义使用“#define”关键字进行定义,没有数据类型限制。

c语言面试题目100及最佳答案精选全文

c语言面试题目100及最佳答案精选全文

精选全文完整版(可编辑修改)c语言面试题目及最佳答案1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。

预处理:头⼀件包含、宏替换、条件编译、删除注释编译:主要进⼀词法、语法、语义分析等,检查⼀误后将预处理好的⼀件编译成汇编⼀件。

汇编:将汇编⼀件转换成⼀进制⼀标⼀件链接:将项⼀中的各个⼀进制⼀件+所需的库+启动代码链接成可执⼀⼀件2、内存的最⼀存储单位以及内存的最⼀计量单位分别是?内存的最⼀存储单位为⼀进制位,内存的最⼀计量单位字节3、#include<> 与#include ""的区别?include<>到系统指定⼀录寻找头⼀件,#include ""先到项⼀所在⼀录寻找头⼀件,如果没有找再到系统指定的⼀录下寻找4、描述⼀下变量的命名规则变量名有字⼀、数值、下划线组成,但不能以数值开头5、变量的声明与定义有啥区别?声明变量不需要建⼀存储空间,变量的定义需要建⼀存储空间6、谈谈c语⼀中有符号和⼀符号的区别?有符号:数据的最⼀位为符号位,0表示正数,1表示负数⼀符号:数据的最⼀位不是符号位,⼀是数据的⼀部分7、谈谈计算机中补码的意义统⼀了零的编码将符号位与其他位统⼀处理将减法运算转换成加法运算8、谈谈数组的特点同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的9、数组的分类数组的分类主要是:静态数组、动态数组两类。

静态数组:类似int arr[5];在程序运⼀就确定了数组的⼀⼀,运⼀过程不能更改数组的⼀⼀。

动态数组:主要是在堆区申请的空间,数组的⼀⼀是在程序运⼀过程中确定,可以更改数组的⼀⼀。

10、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点不初始化:如果是局部数组数组元素的内容随机如果是全局数组,数组的元素内容为0 部分初始化:未被初始化的部分⼀动补0完全初始化:如果⼀个数组全部初始化可以省略元素的个数数组的⼀⼀由初始化的个数确定11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?数组名作为类型:代表的是整个数组的⼀⼀数组名作为地址:代表的是数组⼀元素的地址对数组名取地址:代表的是数组的⼀地址12、谈谈你对⼀维数组在物理上以及逻辑上的数组维度理解⼀维数组在逻辑上是⼀维的,在物理上是⼀维的13、描述⼀下函数的定义与函数的声明的区别函数定义:是指对函数功能的确⼀,包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⼀的函数单位。

c语言笔试面试题目及答案

c语言笔试面试题目及答案

c语言笔试面试题目及答案一、概述C语言作为一种高级编程语言,具有广泛应用的特点,常常是面试中的重要内容。

本文将列举一些常见的C语言笔试面试题目,并提供相应的答案,以供参考。

二、变量与数据类型1. 请解释C语言中的变量是什么?答:变量是一种具有可变值的存储空间,用于存储和表示不同类型的数据。

2. 请列举C语言中的基本数据类型。

答:C语言中的基本数据类型包括int、float、char、double等。

3. 请解释int和float数据类型的区别。

答:int是整型数据类型,用于表示整数;float是浮点型数据类型,用于表示带有小数点的数。

4. 请解释C语言中的数组。

答:数组是由相同数据类型的元素组成的集合,通过索引来访问每个元素。

三、控制流1. 请解释C语言中的条件语句。

答:条件语句用于根据给定的条件执行不同的代码块。

常见的条件语句有if语句和switch语句。

2. 请解释for循环和while循环的区别。

答:for循环用于在已知循环次数的情况下重复执行一段代码;while循环用于在满足条件的情况下重复执行一段代码,循环次数不确定。

3. 请解释C语言中的跳转语句。

答:C语言中的跳转语句用于改变程序的执行顺序,包括break、continue和goto等。

四、函数与指针1. 请解释C语言中的函数。

答:函数是一段封装了特定功能的代码块,通过给定的输入(参数)来产生输出(返回值)。

2. 请解释C语言中的指针。

答:指针是一个变量,用于存储其他变量的内存地址。

通过指针,可以间接访问和操作该地址处的数据。

3. 请解释C语言中的递归函数。

答:递归函数是一种调用自身的函数,适用于解决可以被分解为相同问题的问题,通过不断调用自身来实现。

五、文件操作1. 请解释C语言中的文件操作。

答:文件操作用于读取和写入文件的数据,包括打开文件、读取文件内容、写入文件内容和关闭文件等步骤。

2. 请解释C语言中的文件指针。

答:文件指针是一个用于表示文件位置的指针变量,可以用于定位读写文件的位置。

C语言面试题和答案

C语言面试题和答案

C语言面试题和答案1、C语言程序的基本单位是____A.语句B.函数C.程序行D.字符答案:B2、C语言程序由()组成A.子程序B.过程C.函数D.主程序段程序答案:C3、算法的表示方法有______A.自然语言,传统流程图,N-S流程图,伪代码,计算机语言B.高级语言,汇编语言,机器语言C.C语言,QBASIC语言,InterDevD.图形图像法,描述法,编程法E.计算机语言答案:A4、以下变量定义中合法的是A.short_a=1-.le-1;B.doubleb=1+5e2.5;C.longdo=0xfdaL;D.float2_and=1-e-3;答案:A5、下面说法中正确的选项是()A.int型和long型运算先将int型转换成unsigned型,再转换B.两个float型运算结果为double型C.只要表达式中存在double型,全部其他类型数据都必需转D.表达式中的类型转换与运算挨次有关答案:C6、以下不正确的表达是A.在C程序中,逗号运算符的优先级最低B.在C程序中,APH和aph是两个不同的变量C.若a和b类型相同,在计算了赋值表达式a=b后b中的值将放入a中,而b中的值不变D.当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值答案:D7、以下说法中正确的选项是A.#define和printf都是C语句B.#define是C语句,而printf不是C.printf是C语句,但#define不是D.#define和printf都不是C语句答案:D8、若有条件表达式(exp)?a++:b–,则以下表达式中能完全等价于表达式(exp)的是A.(exp==0B.(exp!=0)C.(exp==1)D.(exp!=1)答案:B9、若有说明:inta[3][4]={0};则下面正确的表达是A.只有元素a[0][0]可得到初值0B.此说明语句不正确C.数组a中各元素都可得到初值,但其值不肯定为0D.数组a中每个元素均可得到初值0答案:D二、问答题1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。

c语言面试题目100及最佳答案

c语言面试题目100及最佳答案

c语言面试题目100及最佳答案1. 介绍C语言的基本数据类型和其范围。

C语言的基本数据类型有char、int、float和double。

它们的范围分别如下:- char: -128到127- int: -32768到32767- float: 3.4e-38到3.4e+38- double: 1.7e-308到1.7e+3082. 什么是指针(Pointer)?请解释指针的作用。

指针是一个变量,其值为另一个变量的地址。

它的作用是用于在程序中动态地分配内存、传递函数参数和实现复杂数据结构,如链表和树。

3. 请解释C语言中的自动变量和静态变量的区别。

自动变量是在函数内部声明的变量,在函数结束时会被销毁。

而静态变量是在函数内或函数外声明的变量,它的值在函数调用之间保持不变。

4. 解释什么是递归函数?递归函数是一个可以调用自身的函数。

在递归函数中,函数会反复调用自己,直到满足终止条件为止。

5. 请解释C语言中的位运算符。

C语言中的位运算符包括与(&)、或(|)、异或(^)、取反(~)、左移(<<)和右移(>>)运算符。

这些运算符用于对二进制数的位进行操作,常用于位掩码和位操作等场景。

6. 什么是结构体?结构体是一种用户自定义的数据类型,它可以包含不同类型的数据成员。

通过结构体,我们可以将多个不同的变量组合在一起,形成一个逻辑上的整体。

7. 解释C语言中的动态内存分配。

动态内存分配是指在程序运行时根据需要动态地分配内存空间。

C 语言中的动态内存分配函数包括malloc、calloc和realloc,通过这些函数可以在程序运行时根据需求分配或释放内存。

8. 请解释C语言中的头文件和库文件的作用。

头文件包含一组函数声明、宏定义和结构体声明等信息,用于在源文件中引用。

库文件则包含已编译的函数实现和数据,通过链接库文件可以在程序中使用这些函数和数据。

9. 什么是指针数组和数组指针?指针数组是一个数组,每个元素都是指针类型。

c面试题目(3篇)

c面试题目(3篇)

第1篇第一部分:基础知识1. 问题:请解释C语言中的数据类型及其特点。

解析:- 基本数据类型:- `int`:用于整数存储,通常占用4个字节。

- `float`:用于单精度浮点数,通常占用4个字节。

- `double`:用于双精度浮点数,通常占用8个字节。

- `char`:用于字符存储,通常占用1个字节。

- `short`:用于短整数存储,通常占用2个字节。

- `long`:用于长整数存储,通常占用4个字节。

- 枚举类型:用于一组预定义的整数值。

- 结构体:用于将不同类型的数据组合成一个整体。

- 联合体:用于存储多个不同类型的数据,但同一时间只能存储其中一种类型的数据。

2. 问题:请解释C语言中的运算符及其优先级。

解析:- 算术运算符:`+`、`-`、``、`/`、`%`。

- 关系运算符:`==`、`!=`、`>`、`>=`、`<`、`<=`。

- 逻辑运算符:`&&`、`||`、`!`。

- 位运算符:`&`、`|`、`^`、`<<`、`>>`。

- 赋值运算符:`=`、`+=`、`-=`、`=`、`/=`、`%=`。

- 其他运算符:`++`、`--`、`()`、`[]`、`->`、`sizeof`、`&`、``。

- 运算符优先级:`()`、`[]`、`->`、``、`&`、`++`、`--`、`!`、`~`、`<<`、`>>`、`<`、`<=`、`>`、`>=`、`==`、`!=`、`^`、`|`、`&`、``、`/`、`%`、`+`、`-`、`<<`、`>>`、`&&`、`||`、`=`、`+=`、`-=`、`=`、`/=`、`%=`。

3. 问题:请解释C语言中的变量作用域和生命周期。

解析:- 局部变量:在函数内部声明的变量,作用域仅限于该函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C/C++经典面试题面试题1:变量的声明和定义有什么区别为变量分配地址和存储空间的称为定义,不分配地址的称为声明。

一个变量可以在多个地方声明,但是只在一个地方定义。

加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。

说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。

面试题2:写出bool 、int、float、指针变量与“零值”比较的if语句bool型数据:if( flag ){A;}else{B;}int型数据:if( 0 != flag ){A;}else{B;}指针型数:if( NULL == flag ){A;}else{B;}float型数据:if ( ( flag >= NORM ) && ( flag <= NORM ) ){A;}注意:应特别注意在int、指针型变量和“零值”比较的时候,把“零值”放在左边,这样当把“==”误写成“=”时,编译器可以报错,否则这种逻辑错误不容易发现,并且可能导致很严重的后果。

面试题3:sizeof和strlen的区别sizeof和strlen有以下区别:❑sizeof是一个操作符,strlen是库函数。

❑sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。

❑编译器在编译时就计算出了sizeof的结果。

而strlen函数必须在运行时才能计算出来。

并且sizeof 计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。

❑数组做sizeof的参数不退化,传递给strlen就退化为指针了。

注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。

最容易混淆为函数的操作符就是sizeof。

面试题4:C语言的关键字static 和C++ 的关键字static 有什么区别在C中static用来修饰局部静态变量和外部静态变量、函数。

而C++中除了上述功能外,还用来定义类的成员变量和函数。

即静态成员和静态成员函数。

注意:编程时static的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而C++的静态成员则可以在多个对象实例间进行通信,传递信息。

面试题5:C中的malloc和C++中的new有什么区别malloc和new有以下不同:(1)new、delete 是操作符,可以重载,只能在C++中使用。

(2)malloc、free是函数,可以覆盖,C、C++中都可以使用。

(3)new 可以调用对象的构造函数,对应的delete调用相应的析构函数。

(4)malloc仅仅分配内存,free仅仅回收内存,并不执行构造和析构函数(5)new、delete返回的是某种数据类型指针,malloc、free返回的是void指针。

注意:malloc申请的内存空间要用free释放,而new申请的内存空间要用delete释放,不要混用。

因为两者实现的机理不同。

面试题6:写一个“标准”宏MIN#define min(a,b)((a)<=(b)?(a):(b))注意:在调用时一定要注意这个宏定义的副作用,如下调用:((++*p)<=(x)?(++*p):(x)。

p指针就自加了两次,违背了MIN的本意。

2面试题7:一个指针可以是volatile吗可以,因为指针和普通变量一样,有时也有变化程序的不可控性。

常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针。

说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。

其保存的数值是个整型数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。

面试题8:a和&a有什么区别请写出以下代码的打印结果,主要目的是考察a和&a的区别。

#include<stdio.h>void main( void ){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));return;}输出结果:2,5。

注意:数组名a可以作数组的首地址,而&a是数组的指针。

思考,将原式的int *ptr=(int *)(&a+1);改为int *ptr=(int *)(a+1);时输出结果将是什么呢?面试题9:简述C、C++程序编译的内存分配情况C、C++中内存分配方式可以分为三种:(1)从静态存储区域分配:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。

速度快、不容易出错,因为有系统会善后。

例如全局变量,static变量等。

(2)在栈上分配:在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。

栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配:即动态内存分配。

程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在何时用free或delete释放内存。

动态内存的生存期由程序员决定,使用非常灵活。

如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

一个C、C++程序编译时内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区。

3面试题10:简述strcpy、sprintf与memcpy的区别三者主要有以下不同之处:(1)操作对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。

(2)执行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。

(3)实现功能不同,strcpy主要实现字符串变量间的拷贝,sprintf主要实现其他数据类型格式到字符串的转化,memcpy主要是内存块间的拷贝。

说明:strcpy、sprintf与memcpy都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适的函数实现拷贝功能。

面试题11:设置地址为0x67a9的整型变量的值为0xaa66int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。

面试题12:面向对象的三大特征面向对象的三大特征是封装性、继承性和多态性:❑封装性:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)。

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

❑多态性:是将父类对象设置成为和一个或更多它的子对象相等的技术。

用子类对象给父类对象赋值之后,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

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

面试题13:C++的空类有哪些成员函数❑缺省构造函数。

❑缺省拷贝构造函数。

❑缺省析构函数。

❑缺省赋值运算符。

❑缺省取址运算符。

❑缺省取址运算符const。

注意:有些书上只是简单的介绍了前四个函数。

没有提及后面这两个函数。

但后面这两个函数也是空类的默认函数。

另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。

4面试题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() {}};void main( void ){B b;//C c;return;}注意:构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的。

面试题16:访问基类的私有虚函数写出以下程序的输出结果:#include <iostream.h>class A5{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 );void main(){B b;Fun pFun;for(int i = 0 ; i < 3; i++){pFun = ( Fun )*( ( int* ) * ( int* )( &b ) + i );pFun();}}输出结果:B::gA::fB::h注意:本题主要考察了面试者对虚函数的理解程度。

一个对虚函数不了解的人很难正确的做出本题。

在学习面向对象的多态性时一定要深刻理解虚函数表的工作原理。

面试题17:简述类成员函数的重写、重载和隐藏的区别(1)重写和重载主要有以下几点不同。

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

相关文档
最新文档