C/C++八股面试题(八)
更多专栏:
超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.请说明struct和class并且说明他们有什么区别?
2.什么是数组名,数组名和指针有什么区别?
3.简单介绍malloc如何使用?
4.malloc底层实现的流程?
5.内存分配的方式有哪些?
内容:
1.请说明struct和class并且说明他们有什么区别?
结构体struct
定义结构体
#include <iostream> using namespace std; struct Point { int x; // 成员变量 x int y; // 成员变量 y void print() { // 成员函数,打印结构体成员 cout << "x: " << x << ", y: " << y << endl; } };
创建结构体变量
int main() { // 创建结构体对象 Point p1; p1.x = 10; // 访问成员并赋值 p1.y = 20; // 调用成员函数 p1.print(); // 输出:x: 10, y: 20 return 0; }
Point p1;
创建了一个Point
类型的变量p1
。- 通过
p1.x
和p1.y
访问并设置Point
类型结构体的成员。 p1.print();
调用print()
成员函数,输出结构体的值。
结构体的初始化
struct Point { int x; int y; }; int main() { // 直接初始化 Point p1 = {10, 20}; // x = 10, y = 20 // 使用成员赋值 Point p2; p2.x = 30; p2.y = 40; cout << "p1.x: " << p1.x << ", p1.y: " << p1.y << endl; cout << "p2.x: " << p2.x << ", p2.y: " << p2.y << endl; return 0; }
结构体的访问权限
- 结构体(
struct
) 的成员默认是 公有的 (public
),可以在类外部直接访问。 - 类(
class
) 的成员默认是 私有的 (private
),只能通过公有成员函数访问。
struct Person { string name; // 默认 public int age; // 默认 public }; int main() { Person p1; p1.name = "John"; // 直接访问 public 成员 p1.age = 30; cout << "Name: " << p1.name << ", Age: " << p1.age << endl; return 0; }
C++中的类Class
类的定义
public
、private
、protected
),默认访问权限为 private
。#include <iostream> using namespace std; class Rectangle { private: double length; // 私有成员变量 double width; // 私有成员变量 public: // 公有成员函数 void setLength(double l) { length = l; } void setWidth(double w) { width = w; } double getArea() { return length * width; } void print() { cout << "Length: " << length << ", Width: " << width << ", Area: " << getArea() << endl; } }; int main() { Rectangle rect; rect.setLength(5.0); // 设置长 rect.setWidth(3.0); // 设置宽 rect.print(); // 打印矩形的属性 return 0; }
类的组成
- 成员变量(属性):定义类的状态,通常是数据成员。它们存储对象的相关信息。
- 成员函数(方法):定义类的行为,操作数据成员或执行某些任务。
- 构造函数:用于初始化类的对象,通常在创建对象时自动调用。
- 析构函数:用于清理类的资源,通常在对象销毁时自动调用。
- 访问控制:控制类成员的访问权限(
public
、private
、protected
)。
成员访问控制:
public
:公有成员,可以在类外部直接访问。private
:私有成员,只能在类的成员函数内部访问,外部无法直接访问。protected
:保护成员,只有类及其派生类的成员函数可以访问。- 默认情况下,类的成员的访问权限是private。
构造函数和析构函数
class Student { private: std::string name; public: Student(const std::string &n); ~Student(); };
成员函数
this
指针在成员函数中访问当前对象。class Circle { private: double radius; public: Circle(double r); double calculateArea(); }; double Circle::calculateArea() { return 3.14 * radius * radius; }
结构体Struct和类Class之间的区别
默认访问权限
- struct:结构体的成员默认访问权限是公共的(public),这意味着结构体的成员在外部可以直接访问。
- class: 默认情况下,class中的成员(包括变量和函数)是 私有的(private),即它们只能在类的成员函数内部访问,外部无法直接访问。
继承
- struct: 当一个 struct 继承自另一个 struct或 class 时,默认的继承方式是 公有继承(public)。这意味着基类的公有成员和保护成员会变成派生类的公有和保护成员。
- class: 当一个 class继承自另一个 struct 或 class时,默认的继承方式是 私有继承(private)。这意味着基类的公有和保护成员会变成派生类的私有成员,无法在外部访问。
例子:
struct Base { int a; // 默认 public }; struct DerivedStruct : Base { // 默认 public 继承 void printA() { std::cout << a << std::endl; } // 可以访问 Base 的 a }; class DerivedClass : Base { // 默认 private 继承 void printA() { std::cout << a << std::endl; } // 不能直接访问 Base 的 a };
DerivedStruct
从Base
继承时,使用的是 公有继承,可以直接访问基类的成员。DerivedClass
从Base
继承时,使用的是 私有继承,无法直接访问基类的成员。
结构体的使用场景:
- 用于存储一组相关的数据,但没有复杂的操作和逻辑。
- 当数据的封装比行为更重要时,例如在处理图形、坐标、日期等数据时。
- 当你需要将数据序列化/反序列化为二进制或其他格式时。
- 作为轻量级的数据容器,适用于性能要求较高的情况。
类的使用场景:
- 当你需要封装数据并附加操作和行为时,类更适合,因为它允许你将数据和操作封装在一起。
- 在面向对象编程中,用于建模现实世界的对象,例如人、车辆、银行账户等。
- 当你需要使用继承和多态来实现代码的扩展和重用。
- 为了实现更复杂的数据结构,如链表、树、图等。
2.什么是数组名,数组名和指针有什么区别?
- 数组名:是一个常量,表示数组的首元素的地址。数组名在大多数情况下会自动转换为指向数组首元素的指针,但它本身并不是一个指针变量。
- 指针:是一个变量,可以存储某个数据的地址,指针可以在程序运行时改变,指向不同的地址。
例子:
int arr[5] = {1, 2, 3, 4, 5}; // 定义一个整型数组 int* ptr = arr; // ptr 是一个指针,指向数组的首元素
arr
是数组名,它代表数组的地址,等同于&arr[0]
,但是它本身是不可修改的。ptr
是指针,它是一个可以修改的变量,指向arr
的首元素。
本质
- 数组名是常量指针:数组名
arr
是一个常量指针,指向数组的第一个元素。数组名本身不可修改,也不能指向数组之外的其他位置。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式/C++八股 文章被收录于专栏
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新