嵌入式大厂面经第 8(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

1. struct 和 class 的区别

主要区别

  • 默认访问权限不同:struct:默认为 publicclass:默认为 private
  • 默认继承方式不同:struct:默认 public 继承class:默认 private 继承
  • 使用习惯不同:struct:通常用于简单的数据结构class:通常用于实现完整的面向对象功能
// struct 示例
struct Point {
    int x;  // 默认 public
    int y;  // 默认 public
    
    void setPoint(int a, int b) {  // 默认 public 方法
        x = a;
        y = b;
    }
};

// class 示例
class Circle {
    double radius;  // 默认 private
    
public:
    Circle(double r) : radius(r) {}
    
    double getArea() {
        return 3.14159 * radius * radius;
    }
};

// 继承示例
struct DerivedStruct : Point {  // 默认 public 继承
    int z;
};

class DerivedClass : Circle {  // 默认 private 继承
    // 无法访问 Circle 的 public 成员
};


2. C++ 类的访问权限

三种访问权限

  1. public类内外都可访问子类可继承
  2. protected类内可访问子类可继承类外不可访问
  3. private类内可访问子类不可继承类外不可访问
class Base {
public:
    int publicVar;      // 公有成员
    
    void publicMethod() {
        cout << "Public method" << endl;
        privateMethod();  // 类内可访问私有方法
    }
    
protected:
    int protectedVar;   // 保护成员
    
    void protectedMethod() {
        cout << "Protected method" << endl;
    }
    
private:
    int privateVar;     // 私有成员
    
    void privateMethod() {
        cout << "Private method" << endl;
    }
};

// 继承与访问权限
class Derived : public Base {
public:
    void test() {
        publicVar = 1;      // 可访问基类公有成员
        protectedVar = 2;   // 可访问基类保护成员
        // privateVar = 3;  // 错误:不能访问基类私有成员
        
        publicMethod();     // 可调用基类公有方法
        protectedMethod();  // 可调用基类保护方法
        // privateMethod(); // 错误:不能调用基类私有方法
    }
};

// 友元函数和友元类
class MyClass {
private:
    int data;
    
    friend void friendFunction(MyClass& obj);  // 友元函数声明
    friend class FriendClass;                  // 友元类声明
    
public:
    MyClass(int d) : data(d) {}
};

// 友元函数可以访问私有成员
void friendFunction(MyClass& obj) {
    cout << "Friend function accessing private data: " << obj.data << endl;
}

// 友元类可以访问私有成员
class FriendClass {
public:
    void accessPrivateData(MyClass& obj) {
        cout << "Friend class accessing private data: " << obj.data << endl;
    }
};


3. 内联函数

基本概念

  • 通过 inline 关键字声明
  • 编译时将函数调用替换为函数体
  • 减少函数调用开销,提高执行效率

特点与使用场景

  1. 优点减少函数调用开销提高执行效率保持代码可读性
  2. 缺点增加代码体积不适合复杂函数不适合频繁修改的函数
// 内联函数定义方式一:使用 inline 关键字
inline int max(int a, int b) {
    return (a > b) ? a : b;
}

// 内联函数定义方式二:在类定义中直接实现
class Calculator {
public:
    // 自动成为内联函数
    int add(int a, int b) {
        return a + b;
    }
    
    // 显式声明为内联函数
    inline int subtract(int a, int b);
    
    // 声明为非内联函数
    int multiply(int a, int b);
};

// 类外定义内联函数
inline int Calculator::subtract(int a, int b) {
    return a - b;
}

// 类外定义非内联函数
int Calculator::multiply(int a, int b) {
    return a * b;
}

// 内联函数的实际应用
class Vector {
private:
    double x, y, z;
    
public:
    Vector(double a, double b, double c) : x(a), y(b), z(c) {}
    
    // 简单的访问器和修改器适合内联
    inline double getX() const { return x; }
    inline double getY() const { return y; }
    inline double getZ() const { return z; }
    
    inline void setX(double a) { x = a; }
    inline void setY(double b) { y = b; }
    inline void setZ(double c) { z = c; }
    
    // 复杂计算不适合内联
    double magnitude() const;
};

// 非内联实现
double Vector::magnitude() const {
    return sqrt(x*x + y*y + z*z);
}


内联函数注意事项

  1. 内联是建议性的编译器可能忽略 inline 关键字复杂函数可能不会被内联
  2. 不适合内联的情况包含循环或递归的函数函数体过大的函数包含虚函数调用的函数
  3. 调试困难内联函数在调试时可能无法单步执行可能导致错误定位困难

更多内容全在下方专栏

全网最受欢迎的嵌入式笔试专栏

笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学

3000+订阅还会涨价,提前订阅提前享受,持续更新中。

专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk

#满分简历要如何准备?##嵌入式笔面经分享##嵌入式测试,嵌入式开发#
全部评论

相关推荐

仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
06-16 16:53
东北大学 C++
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务