C++基础学习
2025年09月24日 02:26
本学习记录基于拥有Java基础进行Java、C++、Python三者对比学习的学习笔记
核心特性:
静态类型语言:变量必须先声明类型(如int a;),编译时会检查类型错误。
好处:提前发现类型错误,代码更可靠; 挑战:需要明确理解数据类型。
编译型语言:代码需通过编译器(如 GCC、Clang)转换为可执行文件后才能运行。
例:g++ code.cpp -o program → 生成program.exe(Windows)或program(Linux)。
对比 Python/Java:Python 是解释型(逐行执行),Java 是 “编译 + 解释”(先编译为字节码,再由 JVM 解释)。
混合编程范式:支持面向过程(如函数封装)和面向对象(如类、继承、多态)。
效率优势:直接操作内存,执行速度接近汇编语言,适合开发高性能软件(如游戏、操作系统组件)。
学习挑战:
需要掌握内存管理(如动态分配new/delete),新手易犯内存泄漏错误。
语法规则严格(如分号结尾、大括号匹配),与 Python 的 “简洁语法” 差异较大。
2. 数据类型详解
2.1 基本数据类型(内存占用与取值范围)
类型 | 字节数 | 取值范围(示例,32 位系统) | 示例 |
int | 4 字节 | -2,147,483,648 ~ 2,147,483,647 | int age = 20; |
char | 1 字节 | -128 ~ 127(或 0 ~ 255,取决于是否有符号) | char c = 'A';(ASCII 码 65) |
bool | 1 字节 | true(非 0)或false(0) | bool isOK = true; |
float | 4 字节 | 约 ±1.2×10^-38 ~ ±3.4×10^38(7 位有效数字) | float pi = 3.14f; |
double | 8 字节 | 约 ±2.2×10^-308 ~ ±1.8×10^308(15 位有效数字) | double pi = 3.14159; |
void | 无存储大小 | 仅用于函数无返回值或指针类型 | void func(); |
2.2 整数类型细分(C++ 特色)
有符号与无符号:
unsigned int(无符号整数)只能存 0 和正数,范围是 0 ~ 4,294,967,295(4 字节)。
例:unsigned int count = 100;(不能存 - 5)。
长整型:
short:通常 2 字节,范围 - 32768 ~ 32767。
long:Windows 下 4 字节,Linux 64 位下 8 字节,范围更大。
long long(C++11 引入):至少 8 字节,范围 - 9×10^18 ~ 9×10^18。
类型范围计算技巧:
1 字节无符号数范围是 0 ~ 2^8-1=255,有符号数范围是 - 2^7 ~ 2^7-1=-128 ~ 127。
2.3 变量声明与初始化(重要!)
未初始化的变量:
int a;(值不确定,可能是垃圾值),建议总是初始化:
int a = 0; 或 int a{0};(C++11 统一初始化语法)。
类型自动推导(C++11):
用auto让编译器自动推断类型(需初始化):
auto x = 10;(等价于int x = 10;),auto f = 3.14f;(float)。
3. 变量和常量
3.1 常量(值不可修改)
const关键字:
const double PI = 3.14159;(必须初始化,否则报错)。
作用:防止代码中意外修改常量值,提高安全性。
宏定义(旧方式):
#define PI 3.14159(预处理阶段替换,无类型检查,不推荐)。
命名规范:
常量名通常全大写(如MAX_SIZE),变量名小写或驼峰式(如userAge)。
4. 运算符(核心难点,需多练习)
4.1 算术运算符
整数除法与浮点除法:
5 / 2 → 2(整数除法,直接截断小数)。
5.0 / 2.0 → 2.5(浮点除法,结果为double)。
强制类型转换:(double)5 / 2 → 2.5((double)将 5 转为双精度浮点数)。
取模运算(%):
规则:a % b结果的符号与a一致。
例:5 % 2 = 1,-5 % 2 = -1,5 % -2 = 1。
4.2 赋值运算符
复合赋值:
a += 5 → a = a + 5,a *= b + 1 → a = a * (b + 1)(注意优先级)。
4.3 自增自减运算符(++/--)
前缀与后缀区别:
int i = 5; int j = i++; // j=5,i=6 int k = ++i; // k=7,i=7 |
i++(后缀):先使用i的值,再自增。
++i(前缀):先自增,再使用i的值。
例:
4.4 逻辑运算符(短路特性)
&&(逻辑与):若左侧为false,右侧表达式不执行。
例:(a > 10) && (b++ > 0),若a <= 10,b++不会执行。
||(逻辑或):若左侧为true,右侧表达式不执行。
!(逻辑非):!true → false,!false → true。
4.5 运算符优先级(必须掌握)
从高到低(常用):
括号()、自增++/ 自减--
算术运算符(*、/、%高于+、-)
比较运算符(<、>、==等)
逻辑运算符(&&高于||)
赋值运算符=
建议:用括号明确运算顺序,避免歧义!
例:a = b + c * d → a = b + (c * d),但写成a = (b + c) * d更清晰。
5. 第一个 C++ 程序
#include <iostream> // 1. 包含输入输出流库,提供cout/cin功能 using namespace std; // 2. 使用std命名空间,避免每次写std:: int main() { // 3. 主函数,程序入口,必须有且只能有一个 cout << "Hello C++!" << endl; // 4. 输出字符串,endl换行并刷新缓冲区 return 0; // 5. 向操作系统返回0,表示程序正常结束 } |
编译运行步骤(以 GCC 为例):
保存代码为hello.cpp。
打开终端,输入g++ hello.cpp -o hello(Windows 用g++ hello.cpp -o hello.exe)。
输入./hello(Windows 输入hello)运行程序,输出Hello C++!。
关键概念:
头文件:.h或.hpp文件,包含函数声明和类型定义,#include用于引入。
命名空间:std是 C++ 标准库的命名空间,cout实际是std::cout。
返回值:main函数的return 0可省略(编译器默认添加),但建议显式写出。
6. 输入输出(用户交互)
6.1 输出到屏幕
基本输出:
int age = 20; cout << "年龄:" << age << endl; // 输出:年龄:20 |
格式化输出(需引入#include <iomanip>):
double pi = 3.1415926; cout << fixed << setprecision(2) << pi << endl; // 输出:3.14 |
fixed:固定小数格式,setprecision(n):保留 n 位小数。
6.2 从键盘读取数据
读取基本类型:
int num; string name; cout << "输入数字和姓名:"; cin >> num >> name; // 输入:18 张三 → num=18,name="张三" cout << "数字:" << num << ",姓名:" << name << endl; |
读取带空格的字符串:
cin遇到空格会停止,需用getline(cin, str):
string sentence; cout << "输入句子:"; getline(cin, sentence); // 输入:Hello world! → sentence="Hello world!" |
注意事项:
若cin读取后用getline,需先清除缓冲区残留的换行符:
cin >> num; cin.ignore(); // 忽略换行符 getline(cin, name); |
7. 条件判断(流程控制)
7.1 if-else 语句
int score; cout << "输入分数:"; cin >> score; if (score >= 90) { cout << "优秀" << endl; } else if (score >= 80) { cout << "良好" << endl; } else if (score >= 60) { cout << "及格" << endl; } else { cout << "不及格" << endl; } |
7.2 switch-case 语句(适用于多条件分支)
char grade; cout << "输入等级(A/B/C):"; cin >> grade; switch (grade) { case 'A': cout << "优秀" << endl; break; // 必须加break,否则会继续执行下一个case case 'B': cout << "良好" << endl; break; case 'C': cout << "及格" << endl; break; default: cout << "无效等级" << endl; } |
注意:
C++ 中if条件必须用()括起,语句块必须用{}(即使只有一行)。
避免 “悬挂 else” 问题,建议始终用{}明确作用域。
8. 循环结构(重复执行代码)
8.1 for 循环(已知次数循环)
// 打印1~10 for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { // 偶数 continue; // 跳过本次循环,继续下一次 } cout << i << " "; } // 输出:1 3 5 7 9 |
8.2 while 循环(条件满足时循环)
int sum = 0, num = 1; while (num <= 10) { sum += num; num++; } cout << "1+2+...+10=" << sum << endl; // 输出:55 |
8.3 do-while 循环(至少执行一次)
int password; do { cout << "输入密码(123正确):"; cin >> password; } while (password != 123); cout << "密码正确!" << endl; |
9. 函数基础(代码复用)
9.1 函数定义与调用
// 函数声明(可省略,若定义在main之前) int add(int a, int b); // 声明:返回类型、函数名、参数类型 // 函数定义 int add(int a, int b) { return a + b; // 返回值类型必须与声明一致 } int main() { int x = 5, y = 7; int result = add(x, y); // 调用函数 cout << x << " + " << y << " = " << result << endl; // 输出:12 return 0; } |
9.2 参数传递方式
值传递:函数接收参数的副本,修改不影响原值。
void change(int num) { num = 100; // 仅修改副本 } int main() { int a = 5; change(a); // a还是5 return 0; } |
引用传递(&):函数直接操作原变量(C++ 特色)。
void change(int& num) { // 参数带& num = 100; // 修改原变量 } int main() { int a = 5; change(a); // a变为100 return 0; } |
9.3 函数重载(同名不同参)
int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } int main() { add(1, 2); // 调用int版 add(1.5, 2.5); // 调用double版 add(1, 2, 3); // 调用三参数版 return 0; } |