MST

星途 面试题库

面试题:C++中const char *p与char * const p在类成员函数中的应用

假设有一个类MyClass,类中有两个成员函数,一个是void func1(const char *str),另一个是void func2(char * const str)。请详细解释这两个函数在功能和使用场景上的区别,并举例说明何时应该使用const char *p作为参数,何时应该使用char * const p作为参数。同时,说明在类的成员函数中使用这两种类型参数时,可能会面临的潜在问题及如何避免。
36.7万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. *func1(const char str) 与 func2(char * const str) 的区别
    • 功能区别
      • void func1(const char *str)const char * 表示指向常量字符的指针,即指针指向的内容不能通过这个指针修改,但指针本身可以指向其他内存地址。这意味着函数 func1 可以读取 str 指向的字符串内容,但不能修改它。
      • void func2(char * const str)char * const 表示指针本身是常量,即一旦指针初始化指向某个内存地址,就不能再让它指向其他地方,但可以修改指针指向的内容。所以函数 func2 可以修改 str 指向的字符串内容,但不能改变 str 指向的地址。
    • 使用场景区别
      • func1(const char *str) 的场景:当函数只需要读取字符串内容,而不需要修改它时,使用 const char *。例如,在字符串查找、字符串打印等操作中,只需要读取字符串的信息,不需要改变字符串本身。
      • func2(char * const str) 的场景:当函数需要修改字符串内容,并且在函数执行过程中不希望改变指针指向的地址时,使用 char * const。比如在原地对字符串进行加密、解密操作,或者字符串格式化操作等,只需要在原字符串上进行修改。
  2. *何时使用 const char p 与 char * const p 作为参数
    • *使用 const char p 的场景
      • 示例代码:
#include <iostream>
void printString(const char *str) {
    std::cout << str << std::endl;
}
int main() {
    const char *s = "Hello, World!";
    printString(s);
    return 0;
}
 - 在上述代码中,`printString` 函数只需要读取字符串并打印,不需要修改字符串内容,所以使用 `const char *` 作为参数。这样可以防止函数内部意外修改字符串,提高程序的安全性。
  • 使用 char * const p 的场景
    • 示例代码:
#include <iostream>
void reverseString(char * const str) {
    int len = 0;
    while (str[len] != '\0') {
        len++;
    }
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}
int main() {
    char s[] = "Hello";
    reverseString(s);
    std::cout << s << std::endl;
    return 0;
}
 - 在 `reverseString` 函数中,需要对字符串进行原地反转,即修改字符串内容,同时在函数执行过程中不需要改变指针 `str` 指向的地址,所以使用 `char * const` 作为参数。

3. 潜在问题及避免方法

  • 使用 const char * 作为参数的潜在问题及避免方法
    • 潜在问题:如果在函数内部不小心尝试修改 const char * 指向的内容,会导致编译错误。例如:
void func1(const char *str) {
    str[0] = 'a'; // 编译错误,不能修改 const 指向的内容
}
 - **避免方法**:仔细编写代码,确保不尝试修改 `const char *` 指向的内容。同时,编译器会在编译阶段检查出这类错误,及时发现并修正。
  • 使用 char * const 作为参数的潜在问题及避免方法
    • 潜在问题:如果在函数内部尝试改变 char * const 指针本身的指向,会导致编译错误。例如:
void func2(char * const str) {
    char newStr[] = "New String";
    str = newStr; // 编译错误,不能改变 const 指针的指向
}
 - **避免方法**:明确函数的需求,如果需要改变指针指向,就不要使用 `char * const`。编写代码时注意不要意外地改变指针指向,编译器同样会在编译阶段发现这类错误。