MST

星途 面试题库

面试题:C++ 非虚函数声明的常见错误之中等难度

请简述在 C++ 中,非虚函数声明时容易出现的函数参数类型不匹配错误的场景,并举例说明如何避免。
45.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

函数参数类型不匹配错误场景

  1. 形参与实参类型不一致:在调用函数时,提供的实参类型与函数声明中的形参类型不匹配。例如函数声明接受 int 类型参数,但调用时传入 double 类型。
  2. 数组参数与指针参数混淆:函数声明期望一个数组作为参数,但调用时传递的是指针,或者反过来。由于在函数参数列表中数组会衰减为指针,容易在实际处理中出现误解。
  3. 函数指针类型不匹配:当使用函数指针调用函数时,函数指针的类型必须与目标函数的类型严格匹配,包括参数类型和返回类型。如果不匹配,就会导致未定义行为。

避免方法示例

  1. 形参与实参类型不一致的避免方法
#include <iostream>

// 函数声明
void printInt(int num) {
    std::cout << "The number is: " << num << std::endl;
}

int main() {
    double numDouble = 3.14;
    // 错误调用,会隐式转换,可能丢失精度
    // printInt(numDouble); 
    // 正确做法,先进行类型转换
    printInt(static_cast<int>(numDouble)); 
    return 0;
}
  1. 数组参数与指针参数混淆的避免方法
#include <iostream>

// 函数声明,接受数组参数
void printArray(int arr[], size_t size) {
    for (size_t i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int* ptr = arr;
    // 正确调用
    printArray(arr, 5); 
    // 明确意图,使用指针调用时要清楚其指向的是数组首元素
    printArray(ptr, 5); 
    return 0;
}
  1. 函数指针类型不匹配的避免方法
#include <iostream>

// 目标函数
int add(int a, int b) {
    return a + b;
}

int main() {
    // 正确定义函数指针类型
    int (*funcPtr)(int, int) = add; 
    // 错误定义,类型不匹配,如返回类型不一致
    // bool (*wrongFuncPtr)(int, int) = add; 
    int result = funcPtr(3, 5);
    std::cout << "Result: " << result << std::endl;
    return 0;
}