2024.9.21 Python与C++的面试八股文整理,类与对象,内存规划,默认函数,虚函数,封装继承多态

1.什么是类,什么是面向对象

(1)类是一种蓝图或者模板,用于定义对象的属性和行为,类通常包括:属性,也就是静态特征,方法,也就是动态特征。属性描述对象的特征,在初始化中输入或者直接写入,方法就是针对于类的函数
(2)而对象就是类的具体实例化,比如class Solution: sol=Solution() 类是定义对象的规则和结构,而对象是实际使用类的实例。类可以看作是“设计图”,而对象是根据设计图构建出的“实物”。
(3)面向对象编程是一种编程范式,使用对象来组织程序的逻辑。
(4)封装:属性,方法隐藏,对外隐藏细节,只提供公开的接口,
(5)继承:允许代码重用与拓展。
(6)多态:不同类的对象可以使用相同的方法名表现出不同的行为,在C++中,通过虚函数和函数重写实现多态,如果忘记在基类中将函数声明为虚函数,那你需要回到基类定义中,将该函数改为虚函数,以实现多态。而python由于其动态类型特征,所有的方法都是虚函数,天然支持多态。

2.在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义

声明告诉编译器某个变量,函数,类的存在,但没有具体的实现,多个源文件可以共享相同的声明,提高代码的复用性和编译效率,编译一次生成对应的obj文件后再次用该类就不需要重复编译了。

3.内联函数

类内部函数自动为内联函数,内联函数的工作原理是在编译阶段进行函数替换,但是会造成代码膨胀

4.成员函数通过什么来区分不同对象的成员函数

他内部隐式地传递了一个指针,叫做 this 指针。这个指针指向的是当前调用成员函数的那个对象的内存地址。

5. C++编译器自动为类产生的四个缺省函数是什么?

(1)默认构造函数,拷贝构造函数,析构函数,赋值函数,他们用于管理对象的生命周期和内存分配
(2)默认构造函数:就是python中的属性,用于初始化对象,你定义了,他就有,你不定义,他就默认给你生成一个
(3)拷贝构造函数:就是说,你用一个旧的对象赋值给新的对象,拷贝构造函数就会调用,用于创建一个浅拷贝,在动态内存管理的时候,你得自己自定义一个拷贝构造函数用来深拷贝。
(4)析构函数:是对象生命周期结束的时候调用的特殊函数,释放对象占用的资源。类名前加~,没有参数也没有返回值
(5)赋值运算符函数:处理现有对象之间的赋值操作,确保正确的资源管理和拷贝

6.构造函数与普通函数相比在形式上有什么不同?

构造函数是类的特殊成员函数,是用于初始化的,他不具有任何类型也不返回任何值。

7.什么时候必须重写拷贝构造函数:

当拷贝构造函数涉及到动态存储分配空间时,要自己写拷贝构造函数,并且要深拷贝。

8.构造函数的调用顺序是:

调用基类构造函数->按声明顺序初始化数据成员->最后调用自己的构造函数

9.new,delete,malloc和free

delete和new对应,是运算符,不是函数,delete调用析构函数,new调用构造函数
malloc和free是标准库函数,不在编译器控制权限之内,所以无法满足动态对象的要求。

10.delete和delete[]

delete只会调用一次析构函数,但是delete会调用每一个成员的析构函数。

11.子类析构和父类析构的关系:

析构函数调用的次序是先派生类,后基类,定义一个对象的时候是先基类构造函数,再派生类构造函数,那么析构的时候刚好相反。

12.虚函数和纯虚函数

虚函数:在基类中冠以关键字virtual的成员函数,提供了一个接口界面,允许派生类中对基类的虚函数重新定义
纯虚函数:在基类中声明,以便在派生类根据需要进行定义

13.什么是引用

引用在 C++ 中是一种强大的工具,允许你使用另一个名称来操作同一个变量。主要特点包括:
(1)必须在声明时初始化。
(2)一旦绑定到某个变量,不能再绑定到其他变量。
(3)引用本身不占用额外的内存。
int a = 10;
int& ref = a;

14.引用的好处

(1)引用不会像按值传递一样创建副本,不用额外占用内存资源
(2)引用和指针效果类似,但是引用语法更简洁,安全。
引用和指针的区别:
(1)引用必须初始化,指针不必
(2)引用初始化后不可改变,指针不必
(3)不存在空值的引用,指针可空

15.常引用

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。比如原参数是一个数,通过常引用使用这个变量的时候,就不可更改,使用本身的时候便可以更改,就是这个意思
(1)保护数据不被修改
(2)支持临时对象的传递
(3)提高效率

16.结构体struct和联合union

结构体可以给每一个变量一个存储空间,union不行,在同一时间只能保存一个成员的值。

17.重载和重写

重载(overload)发生在同一个类里的事情,因为输入输出的数据类型不一样,所以调用的时候,编译器会智能的区分不同的函数,也就是说,编译器认为函数名一样,但是输入类型不一样的前提下,这两个函数就是两个函数,所以就不会报错,但是你胆敢写两个同样的输入输出那完蛋了,报错重定义
重写(override)是两个类,子类和父类之间,父类有一个虚函数,子类重写这个函数,那么就可以做到多态,在实例化的时候,不同的对象根据他不同的类调用同一个函数,是多态的一种形式。

18.有哪几种情况只能用intialization list而不能用assignment(赋值)?

答案:当类中含有const、reference 成员变量;基类的构造函数都需要初始化表。

19.C++不是类型安全的

提供了一些类型转换机制,其中包括 reinterpret_cast,它允许将指针从一种类型转换为另一种完全不相关的类型,这在某些情况下可能导致不安全的操作。C#是的

20.main函数执行前执行的代码是:

全局对象的构造函数会在main函数之前运行

21.内存分配方式

(1)static:从静态存储区域分配,全局变量,和static变量都是静态的存储区域
(2)stack:在栈上创建,执行函数的时候,局部变量的存储单元在栈上创建,执行完则释放
(3)heap:从堆上分配,动态内存分配,程序在运行的时候通过malloc或者new来申请任意多的内存,有程序员来决定在哪里释放内存,动态内存的生命周期由程序员自己决定

22.const和#define

(1)const可以定义数据类型,define只是文本替换,也就是说之后的调用的时候,还是需要定义数据类型,定义的过程容易出现问题
(2)有一些集成的调试工具可以对const常量进行调试,但是不能对宏常量进行调试

23.数组和指针

数组:在内存中占用连续空间,大小在编译时确定,内容可修改(除非是常量数组)。
指针:指向任意内存位置,大小固定,指向的内存块的大小不容易确定,指向常量字符串时内容不可修改。

24.基类的析构函数不是虚函数,会带来什么问题?

派生类的析构函数用不上,会造成资源的泄漏。也就是说,别手贱的把基类默认的虚函数的析构函数给人家变成普通的成员函数了,这样派生类的析构函数就废了,然后析构的时候,基类释放了,派生类没能释放。

25.关于重写

重写:

如果派生类定义了一个与基类非虚成员函数同名、参数列表相同的函数,这个函数在派生类中被称为“隐藏”(hiding)基类的函数,而不是重写(override)。
这种情况下,基类的非虚函数不会被覆盖,而是隐藏。当你通过基类的指针或引用调用这个函数时,仍然会调用基类的版本。

class Base {
public:void func() { // 非虚函数std::cout << "Base func" << std::endl;}
};class Derived : public Base {
public:void func() { // 这是隐藏,而不是重写std::cout << "Derived func" << std::endl;}
};void example() {Base* b = new Derived();b->func(); // 调用的是 Base::func(),输出 "Base func"delete b;
}

Derived 类中的 func() 隐藏了 Base 类中的 func(),但并没有重写它。
通过基类指针 b 调用 func() 时,调用的是基类的实现,而不是派生类的实现。

26.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

参考上面的内存分配问题,全局变量存储在静态存储区域,而局部变量分配在栈区,随着局部函数的销毁而销毁

27.在c++中,不能像python一样进行函数的嵌套定义,这是不被允许的

(1)在 C++ 中,不能在一个函数内部定义另一个函数,但可以使用类成员函数或 Lambda 表达式。
(2)通过值传递,函数不能修改原始变量;通过引用或指针传递,可以允许函数修改原始变量。
(3)如果希望保持参数不变,使用值传递是合适的;如果希望修改,可以使用引用或指针。

28.C语言和C++的区别

C语言面向过程编程
C++面向对象编程
C++还有封装,继承,多态三大特性
C++还有许多类型安全的功能,比如强制类型转换,智能指针
C++支持泛型编程,库多,是山里灵活的狗

29.类的大小和什么有关

首先,类的大小遵循结构体的对齐原则
类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数、静态成员函数、静态数据成员、静态常亮数据成员均对类的大小无影响。
虚函数对类的大小有影响,是因为虚函数表指针带来的影响
虚继承对类的大小有影响,是因为虚基表指针带来的影响

30.函数后面加const

const只能加在类的成员函数后面(普通函数不可以),也就是说这些成员函数是只读函数。

31.静态变量

第一次遇见的时候,初始化一次,之后即使它们的作用域在函数内部,每次调用该函数时也不会重新初始化,而是保留上次调用时的值。

void func() {static int count = 0; // 只初始化一次count++;std::cout << count << std::endl; // 每次调用 func() 时会递增
}

32.全局变量和静态全局变量

全局变量:在文件的任何位置都可以访问,作用域是整个文件(如果在多个文件中定义同名全局变量,可能会导致冲突)。
静态全局变量:在定义它的源文件中可见,不能在其他文件中访问。这是通过在变量前加上 static 关键字来实现的。
如果在头文件中定义了全局变量(不使用 static),那么在包含这个头文件的其他源文件中都能访问这个变量。但这可能会导致链接错误,特别是在多个文件中包含同一头文件时,因为同名变量会导致冲突。
如果在头文件中定义了全局静态变量,那么其他源文件无法访问这个变量,因为它的作用域被限制在定义它的源文件内。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe出现This unlicensed Photoshop app has been disabled

Adobe Acrobat或Photoshop软件突然出现This unlicensed Photoshop app has been disabled 症状 解决方法 删除软件安装目录下的AcroCEF和acrocef_1l两个子文件夹。主要是为了删除AcroCEF.exe。 如果存在复发&#xff0c;则删除xxxxxxx\AdobeGCClient\AdobeGCClient.exe。 不…

Win10 安装VS Code

一、软件介绍 Visual Studio Code&#xff08;简称VS Code&#xff09;是一个由微软开发的免费、开源的代码编辑器。它支持Windows、Linux和macOS操作系统&#xff0c;并且提供了许多功能&#xff0c;使其成为许多开发者的首选开发工具。以下是VS Code的一些主要特点&#xff…

如何在 Debian 系统中启用 root 用户的 SSH 登录功能?

本章教程主要介绍如何在 Debian 上启用 root 用户通过 SSH 登录功能。 注意:root 用户通过 SSH 登录可能会带来安全风险,建议仅在必要时使用,并确保有足够的安全措施。 1. 编辑 SSH 配置文件: 使用文本编辑器打开 SSH 配置文件:sudo vi /etc/ssh/sshd_config2. 修改 Permi…

14_Python面向对象

面向过程与面向对象 在编程范式&#xff08;programming paradigms&#xff09;中&#xff0c;面向过程&#xff08;Procedural Programming&#xff09;和面向对象&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是两种主要的编程风格。 Python是一…

vulnhub(12):bob 1.0.1(gpg文件解密)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.169 Host is up (0.00020s latency). ​ 169是新出现的机器&#xff0c;他就是靶机 nmap端口扫描 nmap -Pn -sV 192.168.72.169 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap…

力扣最热一百题——除自身以外数组的乘积

目录 题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 解法一&#xff1a;左右数组&#xff08;小型动态规划&#xff09; 实现思路 Java写法&#xff1a; 运行时间 C写法&#xff1a; 运行时…

虚拟现实与PD协议快充

随着虚拟现实&#xff08;VR&#xff09;技术的不断进步&#xff0c;索尼的PlayStation VR2&#xff08;简称PS VR2&#xff09;凭借其卓越的性能和沉浸式体验&#xff0c;在游戏界引起了广泛关注。为了进一步拓展PS VR2的应用范围&#xff0c;索尼推出了PS VR2适配器&#xff…

IS-ISv4/6双栈

文章目录 IS-ISv4/6双栈实验要求配置 IS-ISv4/6双栈 实验要求 配置双栈 R1、2、3、4配置 IS-ISv4 和 IS-ISv6&#xff0c;配置IPv6多拓扑 上面为Level-1类型、中间为Level-1-2、下面是Level-2类型 还有就是说ATT位置1有一定要求连接L1/2连接L1或者L2类型路由器&#xff0c;至…

简单题94. 二叉树的中序遍历 (python)20240921

问题描述&#xff1a; #### python&#xff1a; # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution(…

统信服务器操作系统【搭建FTP】设置介绍

如何在操作系统上安装vsftp服务。设置匿名用户登录、设置授权用户密码访问功能,并介绍使用匿名方式、授权用户方式访问vsftp服务。本文适用于A、D、E三个服务器操作系统版本,除安装方式的差异,其他设置均相同。 文章目录 功能概述一、功能介绍二、准备环境三、安装步骤1. 在…

pg_start_backup

pg_start_backup()函数在主库上发起一个在线备份&#xff0c;命令执行成功后&#xff0c;将数据文件拷贝到备份接口中 select pg_start_backup(full0918,false,false); 以上会话不要关闭&#xff0c;复制数据目录。 cp -r /pgdata/data/postgres-f66f5f7a/ /opt/qfusion/mnt/st…

光伏开发:一分钟生成光伏项目报告

传统光伏项目报告的编制往往需要收集大量数据、进行复杂计算与分析&#xff0c;耗时长且易受人为因素影响。自动生成光伏项目报告&#xff0c;依托大数据、云计算、人工智能等先进信息技术&#xff0c;实现了对光伏项目关键参数的快速分析、评估与预测。 一、核心功能与流程 1…

Leetcode面试经典150题-39.组合总数

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…

汇川AM400脉冲轴控制(轴控功能块ST源代码)

汇川AM400如何和编程软件通信连接 汇川AM400PLC如何和编程软件通信连接_汇川am400读取程序-CSDN博客文章浏览阅读159次。本文介绍了如何使用CODESYS编程软件与汇川AM400PLC进行通信连接,包括扫描网络、修改IP地址、刷新日志和下载监控程序的步骤。同时,文章提到了CODESYS编程…

python-3n+1数链/233

一&#xff1a;3n1数链题目描述 在计算机科学上&#xff0c;有很多类问题是无法解决的&#xff0c;我们称之为不可解决问题。然而&#xff0c;在很多情况下我们并不知道哪一类问题可以解决&#xff0c;哪一类问题不可解决。现在我们就有这样一个问题&#xff0c;问题如下&#…

DOG:知识图谱大模型问答的迭代交互式推理,克服长路径和假阳性关系挑战

DOG&#xff1a;知识图谱大模型问答的迭代交互式推理&#xff0c;克服长路径和假阳性关系挑战 秒懂大纲提出背景解法拆解全流程优化和医学关系 创意 秒懂大纲 ├── DoG框架【主题】 │ ├── 背景【研究背景】 │ │ ├── LLMs的局限性【问题描述】 │ │ │ …

go 读取excel

一、安装依赖 go get github.com/tealeg/xlsx二、main.go package mainimport "fmt" import "github.com/tealeg/xlsx"type Student struct {Name stringSex string }func (student Student) show() {fmt.Printf("Name:%s Sex:%s\r\n", stude…

消灭病毒gamedemo

DestoryVirus 一、AudioSourceManager using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioSourceManager : MonoBehaviour {public static AudioSourceManager Instance { get; private set; }public SoundPlayer soundPla…

JavaWeb初阶 day1

目录 tomcat目录结构 tomcat:web服务器软件 项目部署的方式 直接将项目放到webapps下 配置conf/server.xml文件 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 静态项目和动态项目 Servlet Servlet执行原理 Servlet方法&#xff08;生命周期&#x…

Linux入门学习:make/Makefile(Linux项目自动化构建工具)

文章目录 1. makefile文件语法2. make clean工程清理3. 细节语法4. make原理 ⭕背景&#xff1a; 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c…