C++入门基础:从零开始的完整学习指南

Source

1. 什么是C++

C++是一种通用编程语言,由Bjarne Stroustrup于1985年在C语言基础上扩展而来。它既支持面向过程编程,也支持面向对象编程和泛型编程,是系统开发、游戏引擎、高性能计算等领域的主流语言。

C++的核心特点包括:

  • 高性能:编译型语言,运行效率接近底层硬件。
  • 多范式:支持面向过程、面向对象、泛型等多种编程风格。
  • 内存可控:提供指针和手动内存管理能力。
  • 标准库丰富:STL(标准模板库)提供容器、算法、迭代器等强大工具。

2. 开发环境搭建

学习C++的第一步是搭建开发环境。常用的编译器有GCC、Clang和MSVC,集成开发环境(IDE)推荐Visual Studio、CLion或VS Code。

以Windows系统为例,安装MinGW-w64后,可以在命令行中编译运行C++程序:

g++ hello.cpp -o hello.exe
hello.exe

在Linux或macOS系统中,使用系统自带的g++即可:

g++ hello.cpp -o hello
./hello

3. 第一个C++程序

下面是一个经典的Hello World程序,它展示了C++程序的基本结构:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

逐行解释这段代码:

  • #include <iostream>:引入输入输出流标准库。
  • int main():程序入口函数,操作系统从这里开始执行。
  • std::cout:标准输出流对象,用于向控制台打印内容。
  • std::endl:输出换行符并刷新缓冲区。
  • return 0;:返回退出码0,表示程序正常结束。

4. 基本语法与数据类型

C++中的注释有两种写法:单行注释使用//,多行注释使用/* */

// 这是单行注释
/* 这是
   多行注释 */

C++内置的常用数据类型包括:

类型 说明 示例
int 整型 int age = 18;
double 双精度浮点型 double pi = 3.14159;
char 字符型 char grade = 'A';
bool 布尔型 bool isReady = true;
string 字符串(需引入string头文件) string name = "Tom";

变量必须先声明后使用,声明格式为类型 变量名 = 初始值;。常量使用const关键字修饰,定义后不可修改:

const double PI = 3.14159;
int count = 10;
count = 20;  // 合法,变量可以修改
// PI = 3.14;  // 错误,常量不可修改

5. 运算符与表达式

C++支持丰富的运算符,主要包括以下几类:

  • 算术运算符+-*/%(取余)。
  • 关系运算符==!=><>=<=
  • 逻辑运算符&&(与)、||(或)、!(非)。
  • 赋值运算符=+=-=*=/=
  • 自增自减++--

下面是一个综合示例:

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 3;
    cout << "a + b = " << a + b << endl;
    cout << "a / b = " << a / b << endl;  // 整数除法,结果为3
    cout << "a % b = " << a % b << endl;  // 取余,结果为1
    cout << "a > b: " << (a > b) << endl;  // 输出1(true)
    a += 5;  // 等价于 a = a + 5
    cout << "a = " << a << endl;  // 输出15
    return 0;
}

6. 流程控制语句

流程控制语句决定程序的执行顺序,主要包括条件判断和循环两大类。

if-else条件判断

int score = 85;
if (score >= 90) {
    cout << "优秀" << endl;
} else if (score >= 60) {
    cout << "及格" << endl;
} else {
    cout << "不及格" << endl;
}

switch多分支选择

int day = 3;
switch (day) {
    case 1:
        cout << "星期一" << endl;
        break;
    case 2:
        cout << "星期二" << endl;
        break;
    default:
        cout << "其他" << endl;
        break;
}

for循环:适合已知循环次数的情况。

for (int i = 1; i <= 5; i++) {
    cout << "第" << i << "次循环" << endl;
}

while循环:适合条件控制的循环。

int n = 0;
while (n < 5) {
    cout << n << endl;
    n++;
}

break和continuebreak用于跳出整个循环,continue用于跳过本次循环的剩余语句。

7. 函数

函数是组织代码的基本单元,用于封装可复用的逻辑。函数定义包括返回类型、函数名、参数列表和函数体。

#include <iostream>
using namespace std;

// 函数声明
int add(int x, int y);

int main() {
    int result = add(3, 5);
    cout << "3 + 5 = " << result << endl;
    return 0;
}

// 函数定义
int add(int x, int y) {
    return x + y;
}

函数支持默认参数和函数重载。默认参数允许调用时省略部分实参,函数重载允许同名函数拥有不同的参数列表:

// 默认参数
int multiply(int a, int b = 2) {
    return a * b;
}

// 函数重载
int area(int side) {
    return side * side;  // 正方形面积
}
int area(int length, int width) {
    return length * width;  // 长方形面积
}

8. 数组与字符串

数组用于存储同类型元素的集合,声明时需要指定类型和大小。数组下标从0开始。

int scores[5] = {90, 85, 78, 92, 88};
cout << "第一个元素: " << scores[0] << endl;
scores[2] = 80;  // 修改第三个元素

// 遍历数组
for (int i = 0; i < 5; i++) {
    cout << scores[i] << " ";
}
cout << endl;

C++标准库提供了string类型,使用起来比C风格字符数组更安全方便:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name = "Alice";
    string greeting = "Hello, " + name + "!";
    cout << greeting << endl;
    cout << "字符串长度: " << name.length() << endl;
    cout << "第一个字符: " << name[0] << endl;
    return 0;
}

9. 指针与引用

指针是C++的重要特性,它存储变量的内存地址。通过指针可以间接访问和修改变量。

int value = 42;
int* ptr = &value;  // ptr指向value的地址
cout << "value的值: " << value << endl;
cout << "ptr指向的值: " << *ptr << endl;  // 解引用
*ptr = 100;  // 通过指针修改变量
cout << "修改后value: " << value << endl;

引用是变量的别名,定义时必须初始化,且不能重新绑定到其他变量:

int num = 10;
int& ref = num;  // ref是num的引用
ref = 20;  // 修改ref等价于修改num
cout << "num = " << num << endl;  // 输出20

函数传参时,使用引用或指针可以避免拷贝大对象,并允许在函数内部修改实参:

void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

10. 面向对象编程基础

C++支持面向对象编程,核心概念包括类、对象、封装、继承和多态。

类的定义与对象创建

#include <iostream>
#include <string>
using namespace std;

class Student {
private:
    string name;
    int age;

public:
    // 构造函数
    Student(string n, int a) {
        name = n;
        age = a;
    }

    // 成员函数
    void display() {
        cout << "姓名: " << name << ", 年龄: " << age << endl;
    }
};

int main() {
    Student stu("Tom", 20);
    stu.display();
    return 0;
}

封装通过访问修饰符实现:private成员只能在类内部访问,public成员对外可见,protected成员对派生类可见。

继承允许派生类复用基类的成员:

class Animal {
public:
    void eat() {
        cout << "动物在吃东西" << endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        cout << "汪汪叫" << endl;
    }
};

int main() {
    Dog dog;
    dog.eat();   // 继承自Animal
    dog.bark();  // Dog自己的方法
    return 0;
}

多态通过虚函数实现,允许通过基类指针调用派生类的重写方法:

class Shape {
public:
    virtual void draw() {
        cout << "绘制图形" << endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        cout << "绘制圆形" << endl;
    }
};

int main() {
    Shape* shape = new Circle();
    shape->draw();  // 输出"绘制圆形"
    delete shape;
    return 0;
}

11. 标准模板库(STL)入门

STL是C++标准库的核心组成部分,提供通用的数据结构和算法。常用的容器包括vector、map、set等。

vector动态数组

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> nums = {1, 2, 3};
    nums.push_back(4);  // 末尾添加元素
    nums.push_back(5);

    // 遍历vector
    for (int n : nums) {
        cout << n << " ";
    }
    cout << endl;
    cout << "大小: " << nums.size() << endl;
    return 0;
}

map键值对容器

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    map<string, int> ages;
    ages["Alice"] = 25;
    ages["Bob"] = 30;

    cout << "Alice的年龄: " << ages["Alice"] << endl;

    // 遍历map
    for (auto& pair : ages) {
        cout << pair.first << ": " << pair.second << endl;
    }
    return 0;
}

常用算法:STL的algorithm头文件提供了排序、查找等常用算法。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<int> nums = {5, 2, 8, 1, 9};
    sort(nums.begin(), nums.end());  // 升序排序

    for (int n : nums) {
        cout << n << " ";
    }
    cout << endl;

    // 查找元素
    auto it = find(nums.begin(), nums.end(), 8);
    if (it != nums.end()) {
        cout << "找到元素: " << *it << endl;
    }
    return 0;
}

12. 内存管理与智能指针

C++允许手动管理内存,使用new分配堆内存,使用delete释放内存。手动管理容易导致内存泄漏和悬空指针问题,因此现代C++推荐使用智能指针。

// 手动内存管理
int* arr = new int[10];
delete[] arr;  // 释放数组内存

C++11引入了三种智能指针,位于<memory>头文件中:

  • unique_ptr:独占所有权,不可复制,可移动。
  • shared_ptr:共享所有权,通过引用计数管理生命周期。
  • weak_ptr:配合shared_ptr使用,不增加引用计数,用于打破循环引用。
#include <iostream>
#include <memory>
using namespace std;

class Demo {
public:
    Demo() { cout << "构造" << endl; }
    ~Demo() { cout << "析构" << endl; }
};

int main() {
    // unique_ptr自动释放内存
    unique_ptr<Demo> p1(new Demo());
    // 推荐使用make_unique
    auto p2 = make_unique<Demo>();

    // shared_ptr共享所有权
    auto p3 = make_shared<Demo>();
    auto p4 = p3;  // 引用计数加1
    return 0;
}

13. 异常处理

异常处理机制让程序在运行时错误发生时能够优雅地恢复。使用trycatchthrow关键字实现。

#include <iostream>
#include <stdexcept>
using namespace std;

double divide(double a, double b) {
    if (b == 0) {
        throw runtime_error("除数不能为零");
    }
    return a / b;
}

int main() {
    try {
        double result = divide(10, 0);
        cout << "结果: " << result << endl;
    } catch (const exception& e) {
        cout << "捕获异常: " << e.what() << endl;
    }
    return 0;
}

14. 文件读写

C++通过fstream库进行文件操作,支持读文件、写文件和追加模式。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    // 写入文件
    ofstream outFile("data.txt");
    if (outFile.is_open()) {
        outFile << "第一行内容" << endl;
        outFile << "第二行内容" << endl;
        outFile.close();
    }

    // 读取文件
    ifstream inFile("data.txt");
    string line;
    if (inFile.is_open()) {
        while (getline(inFile, line)) {
            cout << line << endl;
        }
        inFile.close();
    }
    return 0;
}

15. 学习建议与常见错误

初学者在学习C++时,建议遵循以下路径:先掌握基础语法和数据类型,再学习函数和数组,然后深入指针和面向对象,最后熟悉STL和现代C++特性。

常见错误及注意事项:

  • 忘记分号:C++每条语句以分号结尾,漏写会导致编译错误。
  • 数组越界:访问数组时下标超出范围会导致未定义行为。
  • 内存泄漏:使用new分配的内存必须用delete释放,推荐使用智能指针。
  • 混淆===:赋值运算符和相等运算符含义完全不同。
  • 忽略编译警告:编译器警告往往提示潜在问题,应认真对待。

多动手写代码、多调试、多阅读优秀开源项目,是提升C++水平最有效的方式。

https://www.bilibili.com/video/BV1qntX62EFX
https://www.bilibili.com/video/BV1qntX62EFX/
https://www.bilibili.com/video/BV1qntX62ENs
https://www.bilibili.com/video/BV1qntX62ENs/
https://www.bilibili.com/video/BV1qntX62E5p
https://www.bilibili.com/video/BV1qntX62E5p/
https://www.bilibili.com/video/BV1ontX62EW6
https://www.bilibili.com/video/BV1ontX62EW6/
https://www.bilibili.com/video/BV1intX62Etp
https://www.bilibili.com/video/BV1intX62Etp/
https://www.bilibili.com/video/BV1intX62EdT
https://www.bilibili.com/video/BV1intX62EdT/
https://www.bilibili.com/video/BV1qntX62EVR
https://www.bilibili.com/video/BV1qntX62EVR/
https://www.bilibili.com/video/BV1intX62EXP
https://www.bilibili.com/video/BV1intX62EXP/
https://www.bilibili.com/video/BV1intX62EX3
https://www.bilibili.com/video/BV1intX62EX3/
https://www.bilibili.com/video/BV1qntX62ELp
https://www.bilibili.com/video/BV1qntX62ELp/
https://www.bilibili.com/video/BV1ontX62Ey4
https://www.bilibili.com/video/BV1ontX62Ey4/
https://www.bilibili.com/video/BV1qntX62EL8
https://www.bilibili.com/video/BV1qntX62EL8/
https://www.bilibili.com/video/BV1qntX62Ecj
https://www.bilibili.com/video/BV1qntX62Ecj/
https://www.bilibili.com/video/BV1qntX62E5B
https://www.bilibili.com/video/BV1qntX62E5B/
https://www.bilibili.com/video/BV1qntX62E51
https://www.bilibili.com/video/BV1qntX62E51/
https://www.bilibili.com/video/BV1ontX62E3d
https://www.bilibili.com/video/BV1ontX62E3d/
https://www.bilibili.com/video/BV1dqtS6MEy7
https://www.bilibili.com/video/BV1dqtS6MEy7/
https://www.bilibili.com/video/BV1dqtS6MEjo
https://www.bilibili.com/video/BV1dqtS6MEjo/
https://www.bilibili.com/video/BV1jqtS6uEF5
https://www.bilibili.com/video/BV1jqtS6uEF5/
https://www.bilibili.com/video/BV1dqtS6MEhx
https://www.bilibili.com/video/BV1dqtS6MEhx/
https://www.bilibili.com/video/BV1dqtS6MEnq
https://www.bilibili.com/video/BV1dqtS6MEnq/
https://www.bilibili.com/video/BV1dqtS6MEj3
https://www.bilibili.com/video/BV1dqtS6MEj3/
https://www.bilibili.com/video/BV1dqtS6ME8Y
https://www.bilibili.com/video/BV1dqtS6ME8Y/
https://www.bilibili.com/video/BV1dqtS6MEX1
https://www.bilibili.com/video/BV1dqtS6MEX1/
https://www.bilibili.com/video/BV1dqtS6MEyA
https://www.bilibili.com/video/BV1dqtS6MEyA/
https://www.bilibili.com/video/BV1dqtS6MERK
https://www.bilibili.com/video/BV1dqtS6MERK/
https://www.bilibili.com/video/BV1dqtS6MESo
https://www.bilibili.com/video/BV1dqtS6MESo/
https://www.bilibili.com/video/BV1dqtS6MEDP
https://www.bilibili.com/video/BV1dqtS6MEDP/
https://www.bilibili.com/video/BV1dqtS6MED3
https://www.bilibili.com/video/BV1dqtS6MED3/
https://www.bilibili.com/video/BV1dqtS6ME6p
https://www.bilibili.com/video/BV1dqtS6ME6p/
https://www.bilibili.com/video/BV1dqtS6ME7b
https://www.bilibili.com/video/BV1dqtS6ME7b/
https://www.bilibili.com/video/BV1dqtS6ME66
https://www.bilibili.com/video/BV1dqtS6ME66/
https://www.bilibili.com/video/BV1dqtS6MEhf
https://www.bilibili.com/video/BV1dqtS6MEhf/
https://www.bilibili.com/video/BV1dqtS6ME24
https://www.bilibili.com/video/BV1dqtS6ME24/
https://www.bilibili.com/video/BV1dqtS6ME2x
https://www.bilibili.com/video/BV1dqtS6ME2x/
https://www.bilibili.com/video/BV1dqtS6MEJN
https://www.bilibili.com/video/BV1dqtS6MEJN/
https://www.bilibili.com/video/BV1oqtS6MENn
https://www.bilibili.com/video/BV1oqtS6MENn/
https://www.bilibili.com/video/BV1dqtS6MEW1
https://www.bilibili.com/video/BV1dqtS6MEW1/
https://www.bilibili.com/video/BV1oqtS6MEPh
https://www.bilibili.com/video/BV1oqtS6MEPh/
https://www.bilibili.com/video/BV1dqtS6MEpd
https://www.bilibili.com/video/BV1dqtS6MEpd/
https://www.bilibili.com/video/BV1oqtS6MEP2
https://www.bilibili.com/video/BV1oqtS6MEP2/
https://www.bilibili.com/video/BV1dqtS6MErS
https://www.bilibili.com/video/BV1dqtS6MErS/
https://www.bilibili.com/video/BV1dqtS6MEC3
https://www.bilibili.com/video/BV1dqtS6MEC3/
https://www.bilibili.com/video/BV1oqtS6MEKp
https://www.bilibili.com/video/BV1oqtS6MEKp/
https://www.bilibili.com/video/BV1jqtS6uEHG
https://www.bilibili.com/video/BV1jqtS6uEHG/
https://www.bilibili.com/video/BV1jqtS6uEG8
https://www.bilibili.com/video/BV1jqtS6uEG8/
https://www.bilibili.com/video/BV1dqtS6MEJh
https://www.bilibili.com/video/BV1dqtS6MEJh/
https://www.bilibili.com/video/BV1jqtS6uEsy
https://www.bilibili.com/video/BV1jqtS6uEsy/
https://www.bilibili.com/video/BV1dqtS6MEQh
https://www.bilibili.com/video/BV1dqtS6MEQh/
https://www.bilibili.com/video/BV1oqtS6MEN9
https://www.bilibili.com/video/BV1oqtS6MEN9/
https://www.bilibili.com/video/BV1dqtS6MEsj
https://www.bilibili.com/video/BV1dqtS6MEsj/
https://www.bilibili.com/video/BV1LBtS6BExw
https://www.bilibili.com/video/BV1LBtS6BExw/
https://www.bilibili.com/video/BV1RBtS6qEBk
https://www.bilibili.com/video/BV1RBtS6qEBk/
https://www.bilibili.com/video/BV1dBtS6qEJY
https://www.bilibili.com/video/BV1dBtS6qEJY/
https://www.bilibili.com/video/BV1dBtS6qEgD
https://www.bilibili.com/video/BV1dBtS6qEgD/
https://www.bilibili.com/video/BV1RBtS6qEYY
https://www.bilibili.com/video/BV1RBtS6qEYY/
https://www.bilibili.com/video/BV1dBtS6qEcc
https://www.bilibili.com/video/BV1dBtS6qEcc/
https://www.bilibili.com/video/BV1RBtS6qEdC
https://www.bilibili.com/video/BV1RBtS6qEdC/
https://www.bilibili.com/video/BV1dBtS6qEcL
https://www.bilibili.com/video/BV1dBtS6qEcL/
https://www.bilibili.com/video/BV1RBtS6qEBE
https://www.bilibili.com/video/BV1RBtS6qEBE/
https://www.bilibili.com/video/BV1LBtS6BEPP
https://www.bilibili.com/video/BV1LBtS6BEPP/
https://www.bilibili.com/video/BV1dBtS6qEna
https://www.bilibili.com/video/BV1dBtS6qEna/
https://www.bilibili.com/video/BV1dBtS6qEAF
https://www.bilibili.com/video/BV1dBtS6qEAF/
https://www.bilibili.com/video/BV1LBtS6BESC
https://www.bilibili.com/video/BV1LBtS6BESC/
https://www.bilibili.com/video/BV1RBtS6qEoy
https://www.bilibili.com/video/BV1RBtS6qEoy/
https://www.bilibili.com/video/BV1RBtS6qEzV
https://www.bilibili.com/video/BV1RBtS6qEzV/
https://www.bilibili.com/video/BV1dBtS6qE35
https://www.bilibili.com/video/BV1dBtS6qE35/
https://www.bilibili.com/video/BV1LBtS6BE75
https://www.bilibili.com/video/BV1LBtS6BE75/
https://www.bilibili.com/video/BV1dBtS6qEKo
https://www.bilibili.com/video/BV1dBtS6qEKo/
https://www.bilibili.com/video/BV1dBtS6qEA2
https://www.bilibili.com/video/BV1dBtS6qEA2/
https://www.bilibili.com/video/BV1dBtS6qEMH
https://www.bilibili.com/video/BV1dBtS6qEMH/
https://www.bilibili.com/video/BV1RBtS6qESy
https://www.bilibili.com/video/BV1RBtS6qESy/
https://www.bilibili.com/video/BV1dBtS6qEGk
https://www.bilibili.com/video/BV1dBtS6qEGk/
https://www.bilibili.com/video/BV1RBtS6qEf8
https://www.bilibili.com/video/BV1RBtS6qEf8/
https://www.bilibili.com/video/BV1dBtS6qEM8
https://www.bilibili.com/video/BV1dBtS6qEM8/
https://www.bilibili.com/video/BV1RBtS6qEiB
https://www.bilibili.com/video/BV1RBtS6qEiB/
https://www.bilibili.com/video/BV1dBtS6qEH6
https://www.bilibili.com/video/BV1dBtS6qEH6/
https://www.bilibili.com/video/BV1RBtS6qE6f
https://www.bilibili.com/video/BV1RBtS6qE6f/
https://www.bilibili.com/video/BV1dBtS6qEVP
https://www.bilibili.com/video/BV1dBtS6qEVP/
https://www.bilibili.com/video/BV1RBtS6qEfC
https://www.bilibili.com/video/BV1RBtS6qEfC/
https://www.bilibili.com/video/BV1LBtS6BEtk
https://www.bilibili.com/video/BV1LBtS6BEtk/
https://www.bilibili.com/video/BV1LBtS6BEa3
https://www.bilibili.com/video/BV1LBtS6BEa3/
https://www.bilibili.com/video/BV1RBtS6qEvU
https://www.bilibili.com/video/BV1RBtS6qEvU/
https://www.bilibili.com/video/BV1RBtS6qEUZ
https://www.bilibili.com/video/BV1RBtS6qEUZ/
https://www.bilibili.com/video/BV1RBtS6qE6E
https://www.bilibili.com/video/BV1RBtS6qE6E/
https://www.bilibili.com/video/BV1dBtS6qEAJ
https://www.bilibili.com/video/BV1dBtS6qEAJ/
https://www.bilibili.com/video/BV1LBtS6BEup
https://www.bilibili.com/video/BV1LBtS6BEup/
https://www.bilibili.com/video/BV1RBtS6qEfM
https://www.bilibili.com/video/BV1RBtS6qEfM/