"C++面试题总结"
面试题1主要涉及C++的多态性。在C++中,当一个父类声明了一个虚函数(`virtual`),即使子类覆盖这个函数时没有再次声明`virtual`,依然能实现多态。这是因为`virtual`修饰符在派生类中会隐式继承。`private`成员也会被继承,但派生类无法直接访问。子类的空间包含了父类的所有非静态成员,并且同一函数在内存中只有一个实体(除了内联函数)。子类覆盖的函数不加`virtual`同样能够实现多态。需要注意的是,父类的私有变量在子类中也是存在的,但不能直接访问。
面试题2展示了两种C++字符串逆序的方法。第一种使用字符数组,通过两个指针分别从首尾向中间交换字符;第二种利用`std::string`的`replace`方法进行字符串替换来达到逆序效果。
面试题3简述了Windows的内存管理。操作系统通过虚拟内存技术解决物理内存不足的问题,将不常用的程序片段移到虚拟内存,需要时再加载到物理内存。内存管理包括块式、页式、段式和段页式管理,现代操作系统通常采用段页式管理,因为它结合了空间利用率和地址计算效率的优势。
面试题4中,代码的结果是1。`#define SQR(X) X*X`定义了一个宏,但在除法操作中,不会进行算术简化。因此,`SQR(k+m)`会被展开为`(k+m)*(k+m)`,在表达式`a /= SQR(k+m)/SQR(k+m)`中,除法优先级高于乘法,最终a等于1。
面试题5讨论了`const`关键字的用法。`const`可以放在指针前、后或两者同时,表示常量指针、指针常量和指针指向的常量。理解这些不同用法对编写安全的代码至关重要。
面试题6比较了两种if语句的写法,其中`if (10 == n)`的写法能防止因误写`=`为`==`而导致的逻辑错误。
面试题7指出了一段代码中可能出现的内存泄漏问题。在`malloc`分配内存后,如果没有检查分配失败或在不再需要内存时释放它,就会造成内存泄漏。
面试题8指出`sscanf`的用法错误,应当传递`&n`作为整型变量的地址。
面试题9的代码中,`strcpy`函数试图将长度超过目标数组`string[10]`的字符串复制进去,导致数组越界。
面试题10的代码同样存在数组越界问题,因为`str1`数组的长度也为10,但`strcpy`可能会复制超出其长度的字符。
面试题11的代码潜在地存在数组越界风险,因为`strcpy`可能会在`str1`中没有遇到`\0`时继续复制,导致越界。建议使用`strncpy`或`memcpy`等更安全的字符串拷贝函数。
以上是对C++面试中常见问题的总结,涵盖了多态性、字符串操作、内存管理、`const`关键字的使用以及常见的编程陷阱等核心知识点。理解并掌握这些内容对于C++开发者来说至关重要。