云计算百科
云计算领域专业知识百科平台

C++面试题及详细答案100道( 21-30 )

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

文章目录

  • 一、本文面试题目录
      • 21. 什么是C++中的默认参数?使用时需要注意什么?
      • 22. 解释C++中的`volatile`关键字的作用。
      • 23. 什么是C++中的函数模板特化?
      • 24. 解释C++中的`noexcept`说明符。
      • 25. 什么是C++中的委托构造函数?
      • 26. 解释C++中的`override`和`final`说明符。
      • 27. 什么是C++中的拷贝赋值运算符和移动赋值运算符?
      • 28. 解释C++中的`constexpr`关键字。
      • 29. 什么是C++中的位域(Bit Fields)?
      • 30. 解释C++中的`using`声明和`using`指令的区别。
  • 二、100道面试题目录列表

一、本文面试题目录

21. 什么是C++中的默认参数?使用时需要注意什么?

答案: 默认参数允许函数在调用时省略部分参数,编译器会自动使用预先定义的值。默认参数必须从右向左连续定义,且在函数声明或定义中只能出现一次。

示例代码:

// 正确:默认参数从右向左连续定义
void func(int a, int b = 2, int c = 3) { /* … */ }

// 错误:默认参数不连续
// void func(int a = 1, int b, int c = 3) { /* … */ }

int main() {
func(10); // 等价于func(10, 2, 3)
func(10, 20); // 等价于func(10, 20, 3)
}

22. 解释C++中的volatile关键字的作用。

答案: volatile告诉编译器该变量可能被意外修改(如硬件、多线程环境),禁止编译器对其进行优化。常用于:

  • 访问硬件寄存器。
  • 多线程中被信号处理函数修改的变量。
  • 示例代码:

    volatile int sensorValue; // 告诉编译器不要缓存该变量的值

    void interruptHandler() {
    sensorValue = readSensor(); // 硬件可能随时修改该值
    }

    int main() {
    while (sensorValue < 100) { // 每次都从内存读取,不使用寄存器缓存
    // …
    }
    }

    23. 什么是C++中的函数模板特化?

    答案: 函数模板特化允许为特定类型提供自定义实现,覆盖通用模板的行为。

    示例代码:

    // 通用模板
    template <typename T>
    T max(T a, T b) {
    return (a > b) ? a : b;
    }

    // 特化版本(针对const char*)
    template <>
    const char* max<const char*>(const char* a, const char* b) {
    return (strcmp(a, b) > 0) ? a : b;
    }

    int main() {
    int x = max(1, 2); // 使用通用模板
    const char* str = max("abc", "def"); // 使用特化版本
    }

    24. 解释C++中的noexcept说明符。

    答案: noexcept用于声明函数不会抛出异常,帮助编译器优化代码。有两种形式:

  • noexcept:等价于noexcept(true),表示函数不会抛出异常。
  • noexcept(expression):根据表达式结果决定是否抛出异常。
  • 示例代码:

    void func() noexcept { // 声明不会抛出异常
    // …
    }

    // 移动构造函数通常标记为noexcept以允许容器优化
    class MyClass {
    public:
    MyClass(MyClass&& other) noexcept { /* … */ }
    };

    25. 什么是C++中的委托构造函数?

    答案: 委托构造函数允许一个构造函数调用同一个类的其他构造函数,避免代码重复。

    示例代码:

    class MyClass {
    private:
    int x, y;
    public:
    // 主构造函数
    MyClass(int a, int b) : x(a), y(b) {}

    // 委托构造函数
    MyClass(int a) : MyClass(a, 0) {} // 调用另一个构造函数

    // 另一个委托构造函数
    MyClass() : MyClass(0, 0) {}
    };

    No.大剑师精品GIS教程推荐
    0 地图渲染基础- 【WebGL 教程】 – 【Canvas 教程】 – 【SVG 教程】
    1 Openlayers 【入门教程】 – 【源代码+示例 300+】
    2 Leaflet 【入门教程】 – 【源代码+图文示例 150+】
    3 MapboxGL【入门教程】 – 【源代码+图文示例150+】
    4 Cesium 【入门教程】 – 【源代码+综合教程 200+】
    5 threejs【中文API】 – 【源代码+图文示例200+】
    6 Shader 编程 【图文示例 100+】

    26. 解释C++中的override和final说明符。

    答案:

    • override:显式声明函数重写基类的虚函数,提高代码可读性并防止意外错误。
    • final:禁止函数被重写或类被继承。

    示例代码:

    class Base {
    public:
    virtual void func() {}
    };

    class Derived : public Base {
    public:
    void func() override final { /* … */ } // 重写并禁止进一步重写
    };

    // 错误:无法继承final类
    // class FurtherDerived : public Derived {};

    27. 什么是C++中的拷贝赋值运算符和移动赋值运算符?

    答案:

    • 拷贝赋值运算符:通过复制已有对象的值来赋值,原型为T& operator=(const T&)。
    • 移动赋值运算符:通过转移临时对象的资源来赋值,原型为T& operator=(T&&)。

    示例代码:

    class MyClass {
    private:
    int* data;
    public:
    // 拷贝赋值运算符
    MyClass& operator=(const MyClass& other) {
    if (this != &other) {
    delete[] data;
    data = new int[*other.data];
    *data = *other.data;
    }
    return *this;
    }

    // 移动赋值运算符
    MyClass& operator=(MyClass&& other) noexcept {
    if (this != &other) {
    delete[] data;
    data = other.data;
    other.data = nullptr;
    }
    return *this;
    }
    };

    28. 解释C++中的constexpr关键字。

    答案: constexpr用于声明编译期常量表达式,允许在编译时计算值,提高性能。可修饰:

  • 变量:值在编译时确定。
  • 函数:若参数为编译期常量,则返回值也为编译期常量。
  • 示例代码:

    constexpr int square(int x) {
    return x * x;
    }

    int main() {
    constexpr int a = square(5); // 编译时计算
    int arr[a]; // 合法:a是编译期常量
    }

    29. 什么是C++中的位域(Bit Fields)?

    答案: 位域允许在结构体或类中按位分配内存,用于节省空间,特别是在嵌入式系统中。

    示例代码:

    struct Flags {
    unsigned int isEnabled : 1; // 1位
    unsigned int isVisible : 1; // 1位
    unsigned int priority : 3; // 3位(取值范围0-7)
    };

    int main() {
    Flags flags;
    flags.isEnabled = 1;
    flags.priority = 5; // 合法
    // flags.priority = 10; // 错误:超出范围
    }

    30. 解释C++中的using声明和using指令的区别。

    答案:

    • using声明:引入特定命名空间成员到当前作用域。
    • using指令:引入整个命名空间到当前作用域。

    示例代码:

    namespace Math {
    int add(int a, int b);
    int sub(int a, int b);
    }

    // using声明
    void func() {
    using Math::add; // 只引入add
    add(1, 2); // 直接使用add
    // sub(3, 4); // 错误:sub未被引入
    }

    // using指令
    void func2() {
    using namespace Math; // 引入整个命名空间
    add(1, 2); // 可用
    sub(3, 4); // 可用
    }

    二、100道面试题目录列表

    文章序号C++面试题100道
    1 C++面试题及详细答案100道(01-10)
    2 C++面试题及详细答案100道(11-20)
    3 C++面试题及详细答案100道(21-30)
    4 C++面试题及详细答案100道(31-40)
    5 C++面试题及详细答案100道(41-50)
    6 C++面试题及详细答案100道(51-60)
    7 C++面试题及详细答案100道(61-70)
    8 C++面试题及详细答案100道(71-80)
    9 C++面试题及详细答案100道(81-90)
    10 C++面试题及详细答案100道(91-100)
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C++面试题及详细答案100道( 21-30 )
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!