前言
如果你已经掌握了C语言的基本语法,恭喜你,学习C++会变得更加得心应手。C++ 是 C 的超集,不仅继承了 C 的灵活与高效,还引入了强大的面向对象编程思想和现代化语法特性。本篇文章将带你从 C 的基础出发,探索 C++ 的基本组成和核心语法,理解其相对于 C 的增强与改进之处。
一、C到C++:语言特性概览
1. C++的增强与特点
相较于 C,C++ 提供了以下新特性:
- 面向对象支持:如类与对象、继承、多态。
- 类型安全增强:如
const
修饰符,nullptr
替代空指针。 - 标准库扩展:提供了 STL(标准模板库),如容器、算法等。
- 新语法特性:如
auto
、基于范围的for
循环。
2. C++ 程序的基本结构
C++ 的程序结构与 C 十分类似,但加入了 namespace
和更灵活的输入输出方式:
#include <iostream> // 标准输入输出头文件
int main() {
std::cout << "Hello, C++!" << std::endl;
return 0;
}
变化点解析:
#include <iostream>
:C++ 使用<iostream>
替代 C 中的<stdio.h>
,支持面向对象的输入输出流。std::cout
:输出流对象,功能类似于 C 中的printf
,但更易扩展。
二、C++关键语法与C语言的对比
1. 输入与输出
C++ 提供了流式输入输出,相比于 C 的 scanf
和 printf
更加直观和安全:
#include <iostream>
int main() {
int age;
std::cout << "Enter your age: "; // 输出提示
std::cin >> age; // 从标准输入读取数据
std::cout << "Your age is: " << age << std::endl;
return 0;
}
改进点:
- 无需手动格式化(如
%d
等),自动处理类型匹配。 - 可链式操作:
std::cout << "A" << "B";
。
2. 常量与类型安全
C++ 引入了 const
和 nullptr
,增强了对常量和空指针的处理:
- 常量:
const double PI = 3.14159;
PI = 3.14; // 错误,const 修饰的变量不可修改
- 空指针:
int* ptr = nullptr; // 替代 C 中的 NULL
if (ptr == nullptr) {
std::cout << "Pointer is null." << std::endl;
}
为什么重要?
const
提高代码的可读性和安全性。nullptr
明确了指针的语义,避免了空指针相关的错误。
3. 引用与指针
C++ 引入了引用(reference
),提供了更简洁的变量访问方式:
- 引用的特点:
- 必须初始化,不能改变绑定对象。
- 更安全且易读,减少了指针操作的复杂性。
示例:引用代替指针传参
void swap(int& a, int& b) { // 使用引用
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10, y = 20;
swap(x, y); // 无需使用地址符
std::cout << "x = " << x << ", y = " << y << std::endl;
return 0;
}
对比 C 的指针传参:
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
C++ 中使用引用传参更直观,代码可读性更高。
4. 自动类型推导:auto
关键字
C++11 提供了 auto
,可以让编译器推导变量类型:
auto x = 10; // 推导为 int
auto y = 3.14; // 推导为 double
auto z = x + y; // 推导为 double
优势:减少冗余代码,特别是在定义复杂类型时(如迭代器)。
三、C++中的其他增强特性
1. 命名空间(namespace
)
为了解决命名冲突问题,C++ 引入了命名空间:
#include <iostream>
namespace Math {
const double PI = 3.14159;
double square(double x) {
return x * x;
}
}
int main() {
std::cout << "PI: " << Math::PI << std::endl;
std::cout << "Square of 5: " << Math::square(5) << std::endl;
return 0;
}
通过命名空间避免了多个模块中的变量或函数名冲突。
2. 基于范围的 for
循环
C++11 简化了循环操作:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
相比于传统 for
循环,基于范围的循环更简洁且易读。