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

定义结构体

  • 我们可以使用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.xp1.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

    类的定义

  • 一个类定义包括成员变量、成员函数、构造函数、析构函数等。类的成员变量和成员函数可以具有不同的访问控制(publicprivateprotected),默认访问权限为 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;
    }
    
    

    类的组成

    • 成员变量(属性):定义类的状态,通常是数据成员。它们存储对象的相关信息。
    • 成员函数(方法):定义类的行为,操作数据成员或执行某些任务。
    • 构造函数:用于初始化类的对象,通常在创建对象时自动调用。
    • 析构函数:用于清理类的资源,通常在对象销毁时自动调用。
    • 访问控制:控制类成员的访问权限(publicprivateprotected)。

    成员访问控制:

    • 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
    };
    
    
    • DerivedStructBase 继承时,使用的是 公有继承,可以直接访问基类的成员。
    • DerivedClassBase 继承时,使用的是 私有继承,无法直接访问基类的成员。

    结构体的使用场景:

    • 用于存储一组相关的数据,但没有复杂的操作和逻辑。
    • 当数据的封装比行为更重要时,例如在处理图形、坐标、日期等数据时。
    • 当你需要将数据序列化/反序列化为二进制或其他格式时。
    • 作为轻量级的数据容器,适用于性能要求较高的情况。

    类的使用场景

    • 当你需要封装数据并附加操作和行为时,类更适合,因为它允许你将数据和操作封装在一起。
    • 在面向对象编程中,用于建模现实世界的对象,例如人、车辆、银行账户等。
    • 当你需要使用继承和多态来实现代码的扩展和重用。
    • 为了实现更复杂的数据结构,如链表、树、图等。

    2.什么是数组名,数组名和指针有什么区别?

    • 数组名:是一个常量,表示数组的首元素的地址。数组名在大多数情况下会自动转换为指向数组首元素的指针,但它本身并不是一个指针变量。
    • 指针:是一个变量,可以存储某个数据的地址,指针可以在程序运行时改变,指向不同的地址。

    例子:

    int arr[5] = {1, 2, 3, 4, 5};  // 定义一个整型数组
    int* ptr = arr;  // ptr 是一个指针,指向数组的首元素
    
    
    • arr 是数组名,它代表数组的地址,等同于 &arr[0],但是它本身是不可修改的。
    • ptr 是指针,它是一个可以修改的变量,指向 arr 的首元素。

    本质

    • 数组名是常量指针:数组名 arr 是一个常量指针,指向数组的第一个元素。数组名本身不可修改,也不能指向数组之外的其他位置。

    剩余60%内容,订阅专栏后可继续查看/也可单篇购买

    嵌入式/C++八股 文章被收录于专栏

    本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

    全部评论
    佬有没有刷题的推荐推荐
    1 回复 分享
    发布于 2024-12-23 16:05 陕西

    相关推荐

    05-05 21:45
    已编辑
    广州大学 Java
    点赞 评论 收藏
    分享
    评论
    10
    24
    分享

    创作者周榜

    更多
    牛客网
    牛客企业服务