嵌入式开发工程师笔试面试指南-C++(3)

嵌入式开发工程师笔试面试指南-C++(3)

编码文章call10242025-03-24 13:56:1718A+A-

三十一 C++中 struct 和 class 的区别?

在C++中,struct和class都可以用来定义自定义数据类型。它们的基本功能是完全一样的,唯一的区别是默认的成员访问权限和继承方式不同。

struct 中声明的成员默认是公共的(public),而 class 中声明的成员默认是私有的(private)。这就是 struct 和 class 的主要区别。因此,在定义类的时候,如果只需要公共的成员,可以使用 struct;如果需要对成员进行更精细的控制,可以使用 class。

此外,struct 与 class 在继承方式上也有所不同。使用 struct 进行继承时,默认的继承方式是 public 继承,而使用 class 进行继承时默认的继承方式是 private 继承。因此,与继承相关的某些概念,如派生类中的成员访问控制和继承链中访问控制的继承,也不完全相同。

另外还有一些其他的区别,例如创建结构时不需要使用 new 关键字分配内存,而在创建类对象时需要使用 new。但在实际使用过程中,这些区别并不会对程序的功能产生重大影响,只是在一些细节上的区别。

总的来说,struct 和 class 的区别并不是很大,主要是在默认的成员访问权限和继承方式上有所不同。除此之外,大部分情况下建议根据需要使用恰当的关键字 struct 或 class 来定义类或模板类型。

三十二 C++结构体和C结构体的区别?

(1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。

(2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种

(3)C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的

(4)C 中使用结构体需要加上 struct 关键字,或者对结构体使用 typedef 取别名,而 C++ 中可以省略 struct 关键字直接使用

三十三 存储类型?

在C++中,存储类型(Storage class)是指用于限定变量和函数对象的可见性、生命周期和存储方式等特点的关键字和修饰符。常见的存储类型包括以下几种:

自动存储类型(auto):表示变量具有自动存储期,在其所在函数或语句块中被创建,在函数或语句块执行结束后自动销毁。

静态存储类型(static):表示变量的生命周期与程序的运行时间相同,在程序启动时被创建,在程序结束后销毁。静态存储类型还可以被用于限定变量或函数的作用域和可见性。

寄存器存储类型(register):表示变量存放在寄存器中,以提高访问速度。由于寄存器数量有限,编译器不一定能够将所有变量都存放在寄存器中,因此register修饰符并不能保证变量一定会存入寄存器中。

外部存储类型(extern):表示变量或函数对象存储在其他文件中,在本文件中只是声明,在链接时才会被实际定义和分配空间。

动态存储类型(dynamic):表示变量的存储空间动态分配,并在适当的时候释放。动态存储类型通常与new和delete运算符一起使用。

以上是常见的存储类型,不同的存储类型适用于不同的场景,可以帮助我们实现更高效、更灵活的编程。

三十四 new、delete、malloc、free关系

功能相似:new和malloc都用于在堆上动态分配内存,delete和free都用于释放动态分配的内存,以防止内存泄漏。

用法差异:new是 C++ 操作符,malloc是 C 语言标准库函数。new在分配内存时会调用构造函数进行对象初始化,malloc仅分配指定字节数的内存空间,不会进行初始化。delete会调用析构函数释放对象资源,free只是单纯释放内存。

返回值不同:new返回的是正确类型的指针,无需进行类型转换。malloc返回的是void*类型的指针,在使用时通常需要进行类型转换。

在 C++ 中,尽量使用new和delete进行内存管理,以利用 C++ 的面向对象特性和类型安全机制;在 C 语言中,则使用malloc和free来进行动态内存分配和释放。

三十五 子类析构时要调用父类的析构函数吗?

在 C++ 中,子类析构时通常要调用父类的析构函数,原因如下:

资源释放完整性:父类可能在构造函数中分配了一些资源,如动态内存、文件句柄等,在析构函数中负责释放这些资源。如果子类析构时不调用父类析构函数,那么父类中分配的资源就无法被正确释放,会导致资源泄漏,影响程序的稳定性和性能。

对象清理顺序:C++ 规定,在销毁一个派生类对象时,会先调用子类的析构函数,然后自动调用父类的析构函数,以确保对象的所有部分都能被正确清理。这是按照对象构造的相反顺序进行的,保证了对象内部状态的一致性和完整性。

虚函数机制支持:当存在虚析构函数时,通过基类指针删除派生类对象,会根据对象的实际类型调用正确的析构函数,实现多态的析构行为,确保子类和父类的资源都能被正确释放。

三十六 结构与联合有和区别?

结构(struct)和联合(union)是 C 和 C++ 等编程语言中用于组织数据的两种不同方式,它们的区别主要如下:

内存分配:结构中的每个成员都有独立的内存空间,整个结构的大小是所有成员大小之和(考虑内存对齐)。联合的所有成员共享同一块内存空间,其大小取决于最大成员的大小。

数据存储:结构可以同时存储多个成员的值,各成员相互独立。联合在同一时刻只能存储一个成员的值,新成员赋值会覆盖旧成员的值。

用途:结构常用于将不同类型但相关的数据组合在一起,如表示一个学生的信息。联合常用于需要在不同时刻存储不同类型数据的场景,如实现通用数据类型的存储和解析。

三十七 引用与指针有什么区别?

定义与性质:引用是已存在变量的别名,不占用额外内存空间,定义时必须初始化且不能再绑定到其他变量。指针是一个变量,存储的是另一个变量的地址,本身占用一定内存空间,定义时可不初始化。

使用方式:引用使用时就像原变量一样,直接访问。指针需要通过解引用操作符*来访问其所指向的变量。

安全性:引用在初始化后就保证指向一个有效的对象,不存在空引用,相对更安全。指针可以为NULL,若对空指针进行操作会导致程序错误。

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

全局变量和局部变量的区别、实现方式以及操作系统和编译器的识别方式如下:

区别

作用域:全局变量作用域是整个程序,可在各个函数及代码块中访问;局部变量作用域仅在定义它的函数或代码块内,出了该范围就无法访问。

生命周期:全局变量从程序启动开始存在,到程序结束才销毁;局部变量在进入其所在函数或代码块时创建,离开时销毁。

存储位置:全局变量一般存于静态存储区,局部变量通常在栈区,若为动态分配的局部变量则在堆区。

初始化:全局变量若未初始化,会自动初始化为 0 或空值;局部变量若未初始化,其值是不确定的随机值。

实现方式

全局变量:编译器为其在静态存储区分配固定内存空间,在可执行文件中有专门存储段。程序运行时,操作系统根据可执行文件信息将其加载到对应内存区域,通过变量名访问内存地址。

局部变量:函数调用时,编译器在栈上为局部变量分配内存,其地址是相对于栈指针的偏移量,函数执行中通过栈指针和偏移量访问,函数返回时栈指针移动释放空间。

识别方式

编译器:通过语法分析,全局变量在函数外定义有文件作用域,局部变量在函数或代码块内有块作用域,编译器为它们生成不同符号表记录相关信息用于编译和链接。

操作系统:加载可执行文件时,依据文件格式信息,识别全局变量所在段和局部变量的栈区等内存区域,运行时管理进程内存空间,为变量提供正确访问环境。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4