1. C++的第一个程序
C++作为C语言的超集,兼容了C语言绝大多数语法特性。这意味着用C语言编写的Hello World程序在C++环境中依然可以正常运行。不过为了明确使用C++编译器,我们需要将源代码文件的后缀名从.c改为.cpp。
cpp复制// C语言风格的Hello World
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
在Visual Studio等现代IDE中,当编译器检测到.cpp后缀时,会自动调用C++编译器而非C编译器。虽然这个简单示例在两种语言中表现相同,但C++提供了更现代化的输入输出方式:
cpp复制// C++风格的Hello World
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
return 0;
}
注意:虽然C++兼容C语法,但在实际开发中应优先使用C++特有的功能,如
iostream替代stdio.h,这能获得更好的类型安全和扩展性。
2. 命名空间namespace
2.1 namespace的价值
命名空间是C++解决命名冲突的核心机制。它通过为变量、函数、类等标识符添加"专属前缀",有效隔离不同模块的同名定义。
典型命名冲突示例:
cpp复制#include <stdlib.h>
int rand = 0; // 与标准库rand()函数冲突
使用命名空间后:
cpp复制namespace MyProject {
int rand = 0; // 安全不冲突
}
int main() {
MyProject::rand = 10;
printf("%d\n", rand); // 访问的是标准库rand
return 0;
}
2.2 namespace的定义与使用
定义方式
cpp复制namespace MathUtils {
const double PI = 3.14159;
double circleArea(double r) {
return PI * r * r;
}
struct Point {
double x, y;
};
}
三种使用方式对比
| 方式 | 语法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 作用域解析符 | Namespace::member |
最安全明确 | 代码冗长 | 大型项目 |
| using声明 | using Namespace::member |
简化常用成员 | 可能引入冲突 | 少量常用成员 |
| using指令 | using namespace Namespace |
最简洁 | 易引发冲突 | 小型项目/教学 |
嵌套命名空间
cpp复制namespace Company {
namespace Project {
namespace Module {
void func() {}
}
}
}
// C++17支持更简洁的语法
namespace Company::Project::Module {
void newFunc() {}
}
