C++面试干货---带你梳理常考的面试题(二)

顾得泉:个人主页

个人专栏:《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》

键盘敲烂,年薪百万!


1.struct 和 class 区别

       1.默认访问权限:struct中的成员默认为public,而class中的成员默认为private。

       2.继承:struct默认为public继承,class默认为private继承。

       3.内存分配方式:struct以值类型(value type)方式分配内存,而class以引用类型(reference type)方式分配内存。

       4.默认构造函数:struct可以没有显式定义构造函数,默认提供一个无参构造函数;而class必须显式定义构造函数,不会默认提供无参构造函数。

       5.默认拷贝函数:struct默认提供浅拷贝构造函数和拷贝赋值运算符;而class默认提供浅拷贝构造函数和拷贝赋值运算符,同时还可以通过定义拷贝构造函数和拷贝赋值运算符进行深拷贝。

在使用时,可以根据具体的需求选择使用struct还是class。通常情况下,如果仅仅需要一个简单的数据结构,可以使用struct,而如果需要更多的功能和灵活性,可以使用class。


 2.声明和定义的区别

       声明(Declaration)是指在程序中引入一个标识符(变量、函数、类型等),以便在后续的代码中使用它。声明告诉编译器或解释器标识符的存在和类型,并为它分配内存空间(对于变量),但不为其赋初值。声明的主要作用是让编译器或解释器知道标识符的存在,从而可以在后续的代码中使用它。

       定义(Definition)是对一个标识符进行声明的同时,给它赋予一个初值或具体的实现。定义既包括声明的作用,也包括为标识符分配内存空间和赋初值(或实现)的作用。定义的主要作用是在程序中为标识符分配内存空间并赋予初值或实现,以便可以进行后续的操作。

       总结来说,声明是引入一个标识符以供后续使用,定义是在声明的同时分配内存空间并赋初值或实现。声明只提供标识符的信息,而定义还提供了标识符的具体值或实现。


 3.继承和多态区别与联系

       继承是指一个类从另一个类获取属性和方法的过程。在继承中,一个类可以继承另一个类的属性和方法,并且可以在其基础上进行扩展或修改。子类继承父类的属性和方法,可以通过继承来实现代码的重用,减少重复编写的工作量。

       多态是指同一个方法可以在不同的对象上使用,并且得到不同的行为结果。多态性允许使用父类类型的变量来引用子类类型的对象,通过向上转型,我们可以实现统一的调用方式,但表现出不同的行为。多态是实现代码的灵活性和可扩展性的重要手段。

       继承和多态之间的联系在于,多态是建立在继承的基础上的。只有在存在继承关系的类之间,才能使用多态。通过继承,子类可以继承父类的方法,并且可以在子类中重写这些方法以实现多态。

       继承和多态之间的区别在于,继承是一个类从另一个类获取属性和方法的过程,而多态是同一个方法可以在不同的对象上产生不同的行为结果。继承是一种静态的关系,它在编译时期就确定了。而多态是一种动态的关系,它在运行时期确定。


4.C++ 11 新特性

1.自动类型推导(auto):可以根据初始化表达式的类型自动推导出变量的类型。

2.简化的迭代器循环(range-based for loop):可以更方便地遍历容器中的元素。

3.初始化列表(initializer list):可以用一组值初始化数组、容器等。

4.移动语义(move semantics):引入了右值引用和移动构造函数,可以有效地避免不必要的拷贝操作,提高性能。

5.lambda表达式:可以在代码中定义匿名函数,方便编写简短的、局部的函数对象。

6.函数对象的默认参数(default function arguments):可以为函数对象的参数指定默认值,简化函数调用。

7.右值引用(rvalue references):可以通过引用绑定到临时对象,进一步增加移动语义的应用场景。

8.合并类(unified class):引入了类的新特性,如类静态断言、类模板别名等。

9.并发编程支持(concurrency support):引入了线程库、原子操作等,方便编写多线程程序。

10.正则表达式支持(regular expression support):引入了正则表达式库,方便进行字符串匹配和替换操作。


5.static 的作用

1.声明静态变量:在类中声明的静态变量,所有实例对象共享同一份副本,不会随实例对象的创建和销毁而改变。

2.定义静态方法:静态方法不依赖于实例对象,可以直接通过类名调用,无需创建对象。

3.创建静态代码块:静态代码块在类加载时被执行,用于初始化静态变量或执行一些静态操作。

4.修饰类:static 修饰的类称为静态内部类,静态内部类的实例化不需要外部类的实例对象。

5.导入静态成员:使用 static import 可以直接导入类中的静态成员,可以直接通过成员名访问,而无需使用类名前缀。

6.控制访问权限:使用 static 可以将成员(变量或方法)设置为私有的,限制外部访问。


6.什么是模板

       在C++中,模板是一种通用的编程工具,它允许程序员编写独立于特定数据类型的函数或类。模板可以在编译时根据传入的参数类型生成对应的代码,从而实现代码的复用和泛型编程。

        在函数模板中,可以定义一个通用的函数,它可以适用于不同类型的数据。例如,可以创建一个模板函数来实现两个整数相加的功能,该函数可以接受任意类型的整数作为参数,并返回它们的和。

        在类模板中,可以定义一个通用的类,它可以适用于不同类型的数据。例如,可以创建一个模板类来实现动态数组的功能,该类可以存储任意类型的数据,并提供动态扩展和访问元素的方法。

        使用模板可以提高代码的灵活性和可复用性,同时减少代码的重复编写。


7.include " " 和 <> 的区别

        " "(双引号)一般用来引用文件路径或包名。在许多编程语言中,使用双引号包围文件路径或包名可以表示一个字符串,这样可以在程序中使用这个字符串来操作文件或调用包中的功能。例如,在C语言中,#include "stdio.h" 表示将文件 stdio.h 包含(include)到程序中。

        <>(尖括号)常用于包含预编译指令或引用标准库文件。在某些编程语言中,尖括号用来引用标准库文件或头文件,这样可以避免与用户自定义的文件或包发生命名冲突。例如,在C语言中,#include &lt;stdio.h> 表示将标准库文件 stdio.h 包含到程序中。


8.函数指针和指针函数的区别

        函数指针是指向函数的指针变量。函数指针可以存储函数的地址,并且可以通过函数指针调用函数。函数指针的类型必须与所指向的函数的返回值类型和参数类型相匹配。

        指针函数是返回指针的函数。指针函数声明时,在函数名之前使用"*"来表示返回的是一个指针。指针函数可以返回指针变量的地址,从而可以访问该指针变量指向的数据。


9.C++ 11 nullptr 比 NULL 优势

       1.类型安全性:nullptr是一个特殊的空指针常量,它的类型是nullptr_t,与其他指针类型不兼容。这意味着你不能将nullptr隐式地转换为其他指针类型,从而提高了类型安全性。

       2.可读性:nullptr明确地表示空指针,更容易理解和阅读。相比之下,NULL在一些上下文中可能导致歧义,因为NULL是一个宏,其实际值可能是0或者(void*)0。

       3.重载支持:nullptr是一个能够进行函数重载的实体,而NULL则无法进行函数重载,它只是一个预处理宏。这使得函数参数能够与nullptr进行重载。

       4.消除二义性:在C++中,存在函数重载的情况下,传递NULL可能会产生二义性,因为NULL可以被解释为0或者(void*)0。而使用nullptr则可以避免这种二义性,因为它只能被解释为空指针。


10.深拷贝和浅拷贝的区别

       浅拷贝是指创建一个新的对象,该对象的内容是原对象中的引用。也就是说,新对象和原对象会共享同样的内存地址,当修改其中一个对象时,另一个对象也会受到影响。浅拷贝可以通过复制引用数据类型的指针或者引用来实现,例如通过复制引用类型的对象、数组或者集合。

       深拷贝是指创建一个新的对象,该对象的内容是原对象中的值而不是引用。也就是说,新对象和原对象是完全独立的,修改其中一个对象不会影响另一个对象。深拷贝需要递归复制引用类型的成员对象,确保每个成员对象都创建一个独立的副本。

       在实际编程中,我们需要根据需求来选择使用深拷贝还是浅拷贝。若需要保持对象之间的独立性,避免互相影响,则应使用深拷贝。否则,如果只需要对象的引用共享,或者对象中没有引用类型的成员对象,则可以使用浅拷贝来提高效率。


 结语:关于本次常见面试题的梳理到这里就结束了,希望本篇文章的分享会对大家的面试带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言,最后祝愿每位伙伴都能找到心意的工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网上搞钱的方法你知道几个?盘点3个普通人都可操作的赚钱项目

项目一&#xff0c;微头条 我们可以借助精彩的文章&#xff0c;分享知识、心得和见解&#xff0c;吸引更多的读者关注并获得更多的点赞与评论。关键字的巧妙运用将使你的文章更具吸引力和影响力&#xff0c;同时也会为你带来更多的关注度和阅读量。我们写微头条文章的时候&…

2024.3.5每日一题

LeetCode 到达目的地的方案数 题目链接&#xff1a;1976. 到达目的地的方案数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff0c;某些路口之间有 双向 道路。输入保证你可以…

LeetCode 2673. 使二叉树所有路径值相等的最小代价【贪心】1917

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

python三剑客之一——Numpy

温故而知新&#xff0c;借着工作需要用到Numpy的机会重新学习一遍Numpy。 Numpy是一个运行速度非常快的数学库&#xff0c;主要用于数组计算&#xff0c;包含如下&#xff1a; 一个强大的N维数组对象ndarray【Nd&#xff08;Dimension维度&#xff09;array】 广播功能函数 整…

2024.3.5

作业1、使用select实现tcp服务器端&#xff0c;poll实现tcp客户端 服务器端&#xff1a; #include <myhead.h> #define SER_IP "192.168.199.131" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[])…

plc远程锁机网关,远程锁机与防拆功能双重保障

在设备租赁和分期购买领域&#xff0c;如何确保设备的安全与资金的回收一直是各大厂家和卖家关注的重点。传统的锁机方式往往需要人工介入&#xff0c;不仅效率低下&#xff0c;而且成本高昂。如今&#xff0c;借助HiWoo Box的远程锁机功能&#xff0c;这些问题将迎刃而解。 什…

Linux运维工具-ywtool默认功能介绍

提示:工具下载链接在文章最后 目录 一.资源检查二.日志刷新三.工具升级四.linux运维工具ywtool介绍五.ywtool工具下载链接 一.资源检查 只要系统安装了ywtool工具,默认就会配置上"资源检查"的脚本资源检查脚本的执行时间:每天凌晨3点进行检查资源检查脚本的检查内容…

基于springboot+vue的球队训练信息管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

日本极致产品力|与日本所有食物百搭,年销量2亿箱的啤酒品牌

摘要&#xff1a;《极致产品力》日本深度研学,可以帮助企业找产品、找方向、找方法,在日本终端市场考察中洞悉热销产品背后的成功逻辑,了解最新最前沿的产品趋势和机会。结合日本消费趋势中国转化的众多经验,从品牌、包装、卖点、技术和生产工艺等多方面寻找中口市场的解决方案…

微服务:Nacos注册中心

国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.认识Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 …

express+mysql+vue,从零搭建一个商城管理系统10--添加商品

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写service部分 一、新建models/goods.js models/goods.js con…

Android开发者该学习哪些东西提高竞争力,Github上最值得学习的10个Android开源项目

什么是 HTTPS? HTTPS (基于安全套接字层的超文本传输协议 或者是 HTTP over SSL) 是一个 Netscape 开发的 Web 协议。 你也可以说&#xff1a;HTTPS HTTP SSL HTTPS 在 HTTP 应用层的基础上使用安全套接字层作为子层。 为什么需要 HTTPS &#xff1f; 超文本传输协议 (…

第三百八十三回

文章目录 1. 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了ModalBarrier组件相关的内容&#xff0c;本章回中将介绍Visibility组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的Visibility组件是一种容器类组件&#xff0c;主要…

win11环境下使用hane WIN NFS Server搭建nfs服务

如题&#xff0c;服务端使用hane win nfs server&#xff0c;客户端也是使用wins系统。 S1&#xff0c;安装nfs服务器端&#xff0c;wins系列除了server系列可以使用nfs服务端&#xff0c;其余必须使用额外的组件来实现NFS文件系统的功能。 Networking Software for Windows …

Nodejs 第四十六章(redis持久化)

redis持久化 Redis提供两种持久化方式&#xff1a; RDB&#xff08;Redis Database&#xff09;持久化&#xff1a;RDB是一种快照的形式&#xff0c;它会将内存中的数据定期保存到磁盘上。可以通过配置Redis服务器&#xff0c;设置自动触发RDB快照的条件&#xff0c;比如在指…

力扣每日一题 用栈实现队列

Problem: 232. 用栈实现队列 文章目录 思路复杂度&#x1f496; 朴素版&#x1f496; 优化版 思路 &#x1f468;‍&#x1f3eb; 路飞题解 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( …

Linux系统的服务/进程

系统守护进程&#xff08;服务&#xff09; •服务就是运行在网络服务器上监听用户请求的进程 •服务是通过端口号来区分的 常见的服务及其对应的端口 1.ftp&#xff1a;21 FTP指的是文件传输协议&#xff0c;它是用于在计算机网络上进行文件传输的标准网络协议。通过FTP&am…

HTTP协议与HTTPS协议

HTTP协议 HTTP协议是一个无状态的协议&#xff0c; 服务器不维护任何有关客户端之前所发请求的消息。 是一种懒政&#xff0c;有状态协议就会更加复杂&#xff0c;需要维护状态&#xff08;历史信息&#xff09;,要是客户或者服务器失效,会产生状态不一致(状态前后不对称),解决…

C++对象内存模型布局详解

目录 本文主要内容如下&#xff1a; 最后还有一些问题&#xff1a; 一、理解虚函数表 二、对象模型概述 三、继承下的C对象模型 单继承&#xff1a; 多继承&#xff1a; 一般的多继承&#xff08;非菱形继承&#xff09;&#xff1a; 菱形继承&#xff1a; 五、虚继承…

【牛客】VL64 时钟切换

描述 题目描述&#xff1a; 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频&#xff0c;现在要设计一个切换电路&#xff0c;sel选择时候进行切换&#xff0c;要求没有毛刺。 信号示意图&#xff1a; 波形示意图&#xff1a; 输入描述&#xff1a; clk0 clk1为时…