C++由Bjarne Stroustrup于1979年在贝尔实验室开始设计,最初称为“C with Classes”,1983年正式命名为C++。作为C语言的超集,C++在保持高效的同时,引入了面向对象、泛型编程、RAII、模板元编程等强大特性,成为系统编程、游戏开发、高性能计算、嵌入式系统等领域的首选语言。本文将为初学者提供一份全面的C++入门指南,从环境搭建到基础语法,从面向对象到标准库,助你构建扎实的编程基础。
一、初识C++:为什么学习C++?
1.1 C++是什么?
C++是一种静态类型、编译型、通用编程语言,支持面向过程、面向对象、泛型编程、函数式编程等多种范式。它以其零开销抽象的设计哲学著称,意味着你只为你使用的特性付出性能代价。
1.2 C++的核心优势
1.3 C++的应用领域
游戏开发:Unreal Engine、Unity底层
操作系统:Windows、Linux内核部分
高性能计算:科学计算、金融建模
数据库:MySQL、MongoDB核心
嵌入式系统:汽车、医疗设备
编译器/解释器:LLVM、V8引擎
二、环境搭建:工欲善其事,必先利其器
2.1 编译器安装
C++是编译型语言,需要将源代码编译为可执行文件。
Windows用户:
安装MinGW-w64或Visual Studio(推荐Visual Studio Community,功能全面)
配置环境变量
Mac用户:
# 安装Xcode命令行工具
xcode-select --install
# 或通过Homebrew安装GCC
brew install gcc
Linux用户(Ubuntu/Debian):
sudo apt update
sudo apt install g++ build-essential
2.2 验证安装
g++ --version
clang++ --version # 如果安装了Clang
2.3 开发工具选择
VS Code推荐插件:
C/C++ (Microsoft)
CMake Tools
Code Runner
2.4 第一个C++程序
创建第一个C++程序 hello.cpp:
#include <iostream>
#include <string>
int main() {
// 输出到控制台
std::cout << "你好,C++世界!" << std::endl;
// 获取用户输入
std::string name;
std::cout << "请输入你的名字:";
std::cin >> name;
std::cout << "欢迎你," << name << "!" << std::endl;
return 0;
}
编译和运行:
# 编译
g++ hello.cpp -o hello
# 运行
./hello # Linux/Mac
hello.exe # Windows
三、C++基础语法
3.1 基本语法规则
#include <iostream>
/*
* 这是一个多行注释
* 用于说明程序功能
*/
int main() {
// 单行注释:这是程序入口
// 语句以分号结束
std::cout << "Hello, C++!" << std::endl;
// 代码块使用花括号{}
if (true) {
std::cout << "这是代码块" << std::endl;
}
return 0; // 返回0表示程序正常结束
}
3.2 变量与数据类型
C++是静态类型语言,变量必须先声明后使用。
#include <iostream>
#include <string>
#include <climits> // 整数类型极限
#include <cfloat> // 浮点类型极限
int main() {
// ========== 基本数据类型 ==========
// 整数类型
int age = 25; // 4字节,-2^31 ~ 2^31-1
short score = 100; // 2字节
long bigNum = 100000L; // 4或8字节
long long veryBig = 10000000000LL; // 8字节
// 无符号整数
unsigned int uAge = 25; // 非负整数
unsigned char byte = 255; // 0~255
// 浮点类型
float price = 19.99f; // 4字节,单精度
double pi = 3.14159265358979; // 8字节,双精度
long double precise = 3.14159265358979323846L; // 扩展精度
// 字符类型
char grade = 'A'; // 单字符,单引号
wchar_t wideChar = L'中'; // 宽字符
char16_t utf16 = u'中'; // UTF-16
char32_t utf32 = U'中'; // UTF-32
// 布尔类型
bool isStudent = true; // true 或 false
// ========== 类型大小 ==========
std::cout << "int大小:" << sizeof(int) << " 字节" << std::endl;
std::cout << "double大小:" << sizeof(double) << " 字节" << std::endl;
std::cout << "bool大小:" << sizeof(bool) << " 字节" << std::endl;
// ========== 类型极限 ==========
std::cout << "int最大值:" << INT_MAX << std::endl;
std::cout << "int最小值:" << INT_MIN << std::endl;
std::cout << "double精度:" << DBL_DIG << " 位有效数字" << std::endl;
// ========== auto类型推导 ==========
auto x = 10; // 推导为int
auto y = 3.14; // 推导为double
auto z = "hello"; // 推导为const char*
// ========== decltype类型推导 ==========
int a = 10;
decltype(a) b = 20; // b的类型与a相同
return 0;
}
3.3 变量命名规范
// 有效标识符
int age; // 小写字母开头
int student_age; // 下划线分隔
int studentAge; // 驼峰命名(常用)
int _internal; // 下划线开头(通常表示内部变量)
// 常量使用大写字母
const int MAX_SIZE = 100;
constexpr double PI = 3.14159;
// 命名规则:
// 1. 只能包含字母、数字、下划线
// 2. 不能以数字开头
// 3. 不能使用关键字(int、if、return等)
// 4. 区分大小写
3.4 运算符
#include <iostream>
int main() {
int a = 10, b = 3;
// ========== 算术运算符 ==========
std::cout << "a + b = " << a + b << std::endl; // 13
std::cout << "a - b = " << a - b << std::endl; // 7
std::cout << "a * b = " << a * b << std::endl; // 30
std::cout << "a / b = " << a / b << std::endl; // 3(整数除法)
std::cout << "a % b = " << a % b << std::endl; // 1(取余)
// ========== 自增自减 ==========
int x = 5;
std::cout << "x++ = " << x++ << std::endl; // 先使用后自增:5
std::cout << "++x = " << ++x << std::endl; // 先自增后使用:7
// ========== 关系运算符 ==========
std::cout << "a > b = " << (a > b) << std::endl; // 1(真)
std::cout << "a == b = " << (a == b) << std::endl; // 0(假)
// ========== 逻辑运算符 ==========
bool flag1 = true, flag2 = false;
std::cout << "flag1 && flag2 = " << (flag1 && flag2) << std::endl; // 与:0
std::cout << "flag1 || flag2 = " << (flag1 || flag2) << std::endl; // 或:1
std::cout << "!flag1 = " << (!flag1) << std::endl; // 非:0
// ========== 位运算符 ==========
unsigned char m = 0b1100; // 12
unsigned char n = 0b1010; // 10
std::cout << "m & n = " << (m & n) << std::endl; // 按位与:8
std::cout << "m | n = " << (m | n) << std::endl; // 按位或:14
std::cout << "m ^ n = " << (m ^ n) << std::endl; // 按位异或:6
std::cout << "~m = " << (~m) << std::endl; // 按位取反
std::cout << "m << 1 = " << (m << 1) << std::endl; // 左移:24
std::cout << "m >> 1 = " << (m >> 1) << std::endl; // 右移:6
// ========== 赋值运算符 ==========
int c = 10;
c += 5; // c = c + 5
c -= 3; // c = c - 3
c *= 2; // c = c * 2
c /= 4; // c = c / 4
// ========== 三元运算符 ==========
int max = (a > b) ? a : b; // 如果a>b取a,否则取b
// ========== 类型转换 ==========
// 隐式转换
double d = 10; // int转double
// 显式转换(C风格)
int i = (int)3.14;
// C++风格转换
int j = static_cast<int>(3.14);
return 0;
}
3.5 输入输出
#include <iostream>
#include <iomanip> // 格式化输出
int main() {
// ========== 基本输入输出 ==========
int age;
std::string name;
std::cout << "请输入姓名和年龄:";
std::cin >> name >> age;
std::cout << "姓名:" << name << ",年龄:" << age << std::endl;
// ========== 格式化输出 ==========
double pi = 3.14159265358979;
// 设置精度
std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 3.14
std::cout << std::setprecision(10) << pi << std::endl; // 3.1415926536
// 设置宽度
std::cout << std::setw(10) << "姓名" << std::setw(10) << "年龄" << std::endl;
std::cout << std::setw(10) << "张三" << std::setw(10) << 25 << std::endl;
// 十六进制输出
std::cout << std::hex << 255 << std::endl; // ff
std::cout << std::dec << 255 << std::endl; // 255
// ========== 读取整行 ==========
std::string line;
std::cout << "请输入一行文本:";
std::cin.ignore(); // 清除缓冲区
std::getline(std::cin, line);
std::cout << "你输入了:" << line << std::endl;
return 0;
}
四、控制流
4.1 条件语句
#include <iostream>
int main() {
int score = 85;
// ========== if-else if-else ==========
if (score >= 90) {
std::cout << "优秀" << std::endl;
} else if (score >= 60) {
std::cout << "及格" << std::endl;
} else {
std::cout << "不及格" << std::endl;
}
// ========== switch语句 ==========
int day = 3;
switch (day) {
case 1:
std::cout << "星期一" << std::endl;
break;
case 2:
std::cout << "星期二" << std::endl;
break;
case 3:
std::cout << "星期三" << std::endl;
break;
case 4:
case 5:
std::cout << "工作日" << std::endl;
break;
default:
std::cout << "周末" << std::endl;
break;
}
// ========== C++17 if初始化语句 ==========
if (int value = 100; value > 50) {
std::cout << "value大于50" << std::endl;
}
// ========== 嵌套条件 ==========
int age = 20;
bool hasTicket = true;
if (age >= 18) {
if (hasTicket) {
std::cout << "可以入场" << std::endl;
} else {
std::cout << "请购票" << std::endl;
}
} else {
std::cout << "未成年人禁止入场" << std::endl;
}
return 0;
}
4.2 循环语句
#include <iostream>
int main() {
// ========== for循环 ==========
std::cout << "for循环:";
for (int i = 1; i <= 5; i++) {
std::cout << i << " ";
}
std::cout << std::endl;
// ========== 基于范围的for循环(C++11) ==========
int arr[] = {1, 2, 3, 4, 5};
std::cout << "范围for循环:";
for (int x : arr) {
std::cout << x << " ";
}
std::cout << std::endl;
// 使用引用修改元素
for (int& x : arr) {
x *= 2;
}
// ========== while循环 ==========
int count = 0;
std::cout << "while循环:";
while (count < 5) {
std::cout << count << " ";
count++;
}
std::cout << std::endl;
// ========== do-while循环 ==========
int n = 0;
std::cout << "do-while循环:";
do {
std::cout << n << " ";
n++;
} while (n < 3);
std::cout << std::endl;
// ========== 嵌套循环:乘法表 ==========
std::cout << "乘法表:" << std::endl;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
std::cout << j << "×" << i << "=" << (i * j) << "\t";
}
std::cout << std::endl;
}
// ========== break和continue ==========
std::cout << "break和continue示例:";
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue; // 跳过5
}
if (i == 8) {
break; // 到达8退出循环
}
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}