C++基础学习

2025年09月24日 02:26


本学习记录基于拥有Java基础进行JavaC++Python三者对比学习的学习笔记

核心特性:

静态类型语言:变量必须先声明类型(如int a;),编译时会检查类型错误。

 好处:提前发现类型错误,代码更可靠;  挑战:需要明确理解数据类型。

编译型语言:代码需通过编译器(如 GCCClang)转换为可执行文件后才能运行。

例:g++ code.cpp -o program 生成program.exeWindows)或programLinux)。

对比 Python/JavaPython 是解释型(逐行执行),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)或false0

bool isOK = true;

float

4 字节

±1.2×10^-38 ~ ±3.4×10^387 位有效数字)

float pi = 3.14f;

double

8 字节

±2.2×10^-308 ~ ±1.8×10^30815 位有效数字)

double pi = 3.14159;

void

无存储大小

仅用于函数无返回值或指针类型

void func();

2.2 整数类型细分(C++ 特色)

有符号与无符号

unsigned int(无符号整数)只能存 0 和正数,范围是 0 ~ 4,294,967,2954 字节)。

例:unsigned int count = 100;(不能存 - 5)。

长整型

short:通常 2 字节,范围 - 32768 ~ 32767

longWindows 4 字节,Linux 64 位下 8 字节,范围更大。

long longC++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 = -15 % -2 = 1

4.2 赋值运算符

复合赋值

a += 5 a = a + 5a *= b + 1 a = a * (b + 1)(注意优先级)。

4.3 自增自减运算符(++/--

前缀与后缀区别

 

int i = 5;

int j = i++;  // j=5i=6

int k = ++i;  // k=7i=7

i++(后缀):先使用i的值,再自增。

++i(前缀):先自增,再使用i的值。

例:

4.4 逻辑运算符(短路特性)

&&(逻辑与):若左侧为false,右侧表达式不执行。

例:(a > 10) && (b++ > 0),若a <= 10b++不会执行。

||(逻辑或):若左侧为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 helloWindows g++ hello.cpp -o hello.exe)。

输入./helloWindows 输入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=18name="张三"

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;

}