分享几个常见基础的面试题

面试题 1:sizeof 和 strlen 的区别

sizeof 和 strlen 有以下区别:
  • sizeof 是一个操作符,strlen 是库函数。
  • sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\ 0‘的字符串作参数。
  • 编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
  • 数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
  • 注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof。

面试题 2:C 语言的关键字  static  和  C++  的关键字  static  有什么区别

在 C 中 static 用来修饰局部静态变量和外部静态变量、函数。而 C++中除了上述功能外,还用来定义类的成员变量和函数。即静态成员和静态成员函数。

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

面试题 3: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 释放,不要混用。因为两者实现的机理不同。

面试题 4:简述 strcpy、sprintf 与 memcpy 的区别

三者主要有以下不同之处:

(1) 操作对象不同, strcpy 的两个操作对象均为字符串, sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串, memcpy的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

参数的区别:隐藏函数和被隐藏的函数的参数列表可以相同,也可不同,但是函数名肯定要相同。

当参数不相同时,无论基类中的参数是否被 virtual 修饰,基类的函数都是被隐藏,而不是被重写。
说明:虽然重载和覆盖都是实现多态的基础,但是两者实现的技术完全不相同,达到的目的也是完全不同的,覆盖是动态态绑定的多态,而重载是静态绑定的多态。

面试题 7:简述 C、C++程序编译的内存分配情况

C、C++中内存分配方式可以分为三种:

(1)从静态存储区域分配:

内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static 变量等。

(2)在栈上分配:

在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配:

即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。 如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

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

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

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

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

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

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

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

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

  • 缺省构造函数。
  • 缺省拷贝构造函数。
  •  缺省析构函数。
  • 缺省赋值运算符。
  • 缺省取址运算符。
  • 缺省取址运算符  const。
注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。

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

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

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

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

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

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

编译器发现一个类中有虚函数,便会立即为此类生成虚函数表  vtable。虚函数表的各表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针 vptr (对 vc 编译器来说,它插在类的第一个位置上)指向虚函数表。调用此类的构造函数时,在类的构造函数中,编译器会隐含执行 vptr 与 vtable 的关联代码,将 vptr 指向对应的 vtable,将类与此类的 vtable 联系了起来。另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的 this 指针,这样依靠此 this 指针即可得到正确的 vtable,。如此才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。
注意:一定要区分虚函数,纯虚函数、虚拟继承的关系和区别。牢记虚函数实现原理,因为多态C++面试的重要考点之一,而虚函数是实现多态的基础。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以给你一些关于 Java 的面试题资料: 1. 《Java 编程思想》(Thinking in Java)这本书是一本关于 Java 编程的经典教程,包含了 Java 的基础知识和一些比较复杂的主题,对于准备 Java 面试非常有帮助。 2. 《Java 面试宝典》这是一本关于 Java 面试的专业书籍,包含了大量的 Java 面试题和答案,可以帮助你更好地准备面试。 3. 《Java 核心技术·卷 I》(Java SE)这本书是 Oracle 出版的 Java 官方文档,包含了 Java SE 的所有核心知识,对于准备 Java 面试也是非常有帮助的。 4. 网上的模拟面试系统,比如 InterviewBit、LeetCode、HackerRank 等,都可以帮助你更好地准备面试,通过模拟面试的方式练习面试题。 希望这些资料能帮助你准备 Java 面试。 ### 回答2: 很高兴为您提供关于Java面试题的推荐资料。 首先,我建议您可以从以下几个方面来寻找相关的Java面试题资料: 1. 书籍推荐:有许多经典的Java面试题书籍可以帮助您准备面试。其中比较知名的包括《Java程序员面试宝典》、《剑指Offer》等。这些书籍中包含了大量的常见的Java面试题及其解析,可以帮助您对Java面试题有一个全面的了解。 2. 在线教育平台:目前有许多在线教育平台提供了丰富的Java面试题资料,比如知乎、CSDN、博客园等。可以通过搜索关键词“Java面试题”来获取大量相关资料,这些资料往往由经验丰富的Java工程师分享,包括常见的编程题、算法题、设计模式题等。 3. 面试准备网站:有一些专门为面试准备提供资料的网站,比如牛客网、LeetCode等。这些网站提供了大量的编程题和算法题,可以帮助您熟悉常见面试题类型和解答思路,同时还可以通过参与在线编程竞赛提高解题能力。 最后,我建议您在准备Java面试题时,不仅要注重答案的准确性,还要理解其中的原理和背后的思想。此外,注意平衡理论与实践,多进行实际的编码练习,熟悉Java常用的开发工具和框架,这样在面试时才能更加游刃有余。祝您面试顺利! ### 回答3: 在准备Java面试过程中,推荐以下几种Java面试题资料: 1. 《Java编程思想》:这是一本广为流传的Java经典书籍,不仅深入浅出地讲述了Java编程的基础知识,还涵盖了许多常见面试题。 2. 网上Java面试题集:可以通过搜索引擎找到很多网上整理的Java面试题集。一些知名的技术博客和论坛上也有Java面试必备题库,可以多多搜索和收集。 3. Java相关的MOOC课程:选择一门优质的Java相关的在线课程,学习课程中的练习题和考试题目,这些题目一般会紧密结合实际应用场景,有助于提升实战能力。 4. IT技术社区和博客:加入一些知名的IT技术社区或关注几个知名的技术博客,这些平台上的经验分享和技术讨论往往会涉及到一些面试相关的问题,可以增加一些思路和解题技巧。 5. 面试经验分享:在各种面试准备网站或社交媒体上,可以找到很多关于Java面试经验的分享。这些分享中有些会提到一些常问的问题和经典的面试题,可以作为参考。 需要注意的是,Java面试题主要涵盖基础知识、算法与数据结构、多线程、IO、网络编程、设计模式等领域,建议综合多个资料和资源进行学习和准备,灵活选择适合自己的面试题资料。同时,还要结合自己的实际经验和项目经历,进行针对性的准备和答题技巧的培养。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值