C++面试题解析:头文件、const、extern C和循环优化

需积分: 9 4 下载量 28 浏览量 更新于2024-12-10 收藏 45KB DOC 举报
"C++ 面试题汇总1" C++ 是一门功能强大且广泛应用的编程语言,掌握 C++ 的知识点对于程序员来说是非常重要的。本文将从头文件中的 ifndef/define/endif、include 语句、const 关键字、extern "C" 声明、for 循环优缺点、内存管理等方面对 C++ 的面试题进行总结和解释。 **头文件中的 ifndef/define/endif** 头文件中的 ifndef/define/endif 是一种防止头文件被重复包含的机制。当我们在头文件中使用 ifndef/define/endif 时,编译器在编译时会检查头文件是否已经被包含,如果已经被包含,则跳过当前头文件的编译,从而避免了头文件的重复包含。 **include 语句** include 语句用于引入头文件,头文件中包含了函数和变量的声明。include 语句有两种形式:`#include <filename.h>` 和 `#include "filename.h"`。`#include <filename.h>` 从标准库函数路径搜索文件,而 `#include "filename.h"` 先从当前工作目录搜索文件,如果找不到则从标准库函数路径搜索。 **const 关键字** const 关键字在 C++ 中有多种用途,以下是其中的三种: 1. 定义常量:使用 const 关键字可以定义一个常量,例如 `const int a = 10;`。 2. 修饰函数参数及返回值:使用 const 关键字可以修饰函数的参数及返回值,例如 `void foo(const int x) { ... }`。 3. 修饰 C++ 成员函数:使用 const 关键字可以修饰 C++ 成员函数,使得该函数不能修改类的数据成员,例如 `class A { void foo() const { ... } };`。 **extern "C" 声明** 在 C++ 程序中调用被 C 编译器编译后的函数时,需要使用 extern "C" 声明。这是因为 C 语言编译后的函数名与 C++ 编译后的函数名不同。extern "C" 声明表明所要连接的函数是 C 语言编译函数。 **for 循环优缺点** for 循环是一种常用的循环语句,在 C++ 中有多种形式。下面是两种常见的 for 循环形式: ``` // 第一个 for(i=0;i++;) { if(condition) DoSomething(); else DoOtherthing(); } // 第二个 if(condition) { for(i=0;i++;) DoSomething(); } else { for(i=0;i++;) DoOtherthing(); } ``` 这两个 for 循环形式都有其优缺点: * 第一个 for 循环的优点是适用于几乎所有情况,特别是在循环中条件 condition 会改变且操作也必须随之改变的时候,只能用这种方法;但是每次循环时多了一层判断,编译器不能对循环进行优化,降低了效率。 * 第二个 for 循环的优点是效率高,省去了不必要的重复的判断;但是在多线程或其他能使 condition 在循环中改变的情况不适合。 **内存管理** 在 C++ 中,内存管理是非常重要的。下面是一个关于内存管理的思考题: ``` void GetMemory(char* p) { p = (char*)malloc(100); } void Test(void) { char* str = NULL; GetMemory(str); strcpy(str, "helloworld"); printf(str); } ``` 在上面的代码中,GetMemory 函数将内存分配给了 str,但是 str 的值并没有被改变,因此在 Test 函数中,str 仍然为 NULL,导致程序崩溃。 ``` char* GetMemory(void) { char p[] = "helloworld"; return p; } void Test(void) { char* str = NULL; str = GetMemory(); printf(str); } ``` 在上面的代码中,GetMemory 函数返回了一个局部数组的地址,但是这个地址在函数返回后将被释放,因此在 Test 函数中,str 将指向一个无效的内存地址,导致程序崩溃。