C++的演进与我的编程学习之旅:从底层基础到AI应用

编程世界的魅力在于,既要深入理解计算机系统的本质,又要不断拥抱新技术浪潮

一、C++语言概述

1.1产生背景与发展历程

C++起源于1979年,由贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士 创建。最初被称为"C with Classes"(带类的C),旨在扩展C语言以支持面向对象编程,同时保留C语言的效率和灵活性。

C++的发展历程可划分为三个主要阶段:
第一阶段(1980年代-1995年) :C++主要作为传统面向对象语言发展,凭借接近C语言的效率,在工业界占据了重要地位
第二阶段(1995年-2000年) :标准模板库(STL)和Boost等程序库的出现,使泛型编程在C++中占据更大比重
第三阶段(2000年至今) :产生式编程和模板元编程的出现,使C++进入新的发展高峰

C++的标准化工作始于1989年,第一个国际标准C++98于1998年发布。此后,C++陆续更新了C++11、C++14、C++17、C++20等标准,每个新标准都增加了新特性,提高了语言的性能和可用性。

1.2 C++的核心特性与优势

C++是一种静态类型、编译式、通用编程语言,支持多重编程范式,包括过程化编程、面向对象编程和泛型编程。其主要优势包括:
高性能 :C++代码编译后运行效率高,适合开发对性能要求严格的应用程序
灵活性 :支持多种编程范式,不强制开发者使用单一编程风格
底层控制 :允许直接操作内存和硬件资源,提供细粒度的资源控制能力
丰富的标准库 :标准模板库(STL)提供大量通用类和函数,支持常见的数据结构和算法

C++在系统编程、游戏开发、嵌入式系统等领域保持着重要地位,许多知名软件和系统(如Windows、Linux部分组件、游戏引擎等)都使用C++开发。

二、我的C++学习历程

2.1 初识C++:从谭浩强教材开始

我的C++学习之旅始于大学时期,当时使用的是**谭浩强的《C++程序设计》**​ 教材。这本书非常适合初学者,通过循序渐进的方式介绍了C++的基本语法和编程概念。

最初接触C++时,其复杂的语法和丰富的特性 让我有些应接不暇。从变量定义、数据类型到运算符使用,这些基础知识就像构建大厦的基石,需要用心理解和记忆

。通过不断编写简单程序,如计算数学表达式、输出文本信息等,我逐渐熟悉了C++的基本语法规则,也开始体会到编程中逻辑思维的重要性。

学习过程中我发现,严谨细致的态度 对编程至关重要。一个小小的错误,可能是一个分号的遗漏,或者是变量作用域的混淆,都可能导致程序无法正常运行。这让我养成了仔细检查代码的习惯

2.2 面向对象编程的突破

随着学习的深入,C++的面向对象编程(OOP)特性 成为了我探索的重点。类和对象的概念犹如打开了一扇通往全新编程范式的大门。通过封装、继承和多态,我学会了将现实世界中的事物抽象为代码中的类,赋予它们属性和行为。

为了加深理解,我尝试设计一个图形处理程序:创建基类"图形",包含计算面积和周长等通用方法,然后通过继承派生出"圆形"、"矩形"、"三角形"等具体的图形类,每个类根据自身特点实现独特的计算方法。这种面向对象的设计方式使程序结构清晰、易于扩展和维护,也让我感受到了编程的强大创造力。

下面是一个简单的C++面向对象编程示例,展示了类和继承的基本用法:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

// 基类:图形
class Shape {
protected:
    string name;
public:
    Shape(string n) : name(n) {}
    virtual double area() const = 0; // 纯虚函数
    virtual void display() const {
        cout << "图形:" << name << endl;
    }
    virtual ~Shape() {} // 虚析构函数
};

// 派生类:圆形
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : Shape("圆形"), radius(r) {}
    double area() const override {
        return 3.14159 * radius * radius;
    }
    void display() const override {
        Shape::display();
        cout << "半径:" << radius << ", 面积:" << area() << endl;
    }
};

// 派生类:矩形
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(double w, double h) : Shape("矩形"), width(w), height(h) {}
    double area() const override {
        return width * height;
    }
    void display() const override {
        Shape::display();
        cout << "宽度:" << width << ", 高度:" << height << ", 面积:" << area() << endl;
    }
};

int main() {
    Shape* shapes[2];
    shapes[0] = new Circle(5.0);
    shapes[1] = new Rectangle(4.0, 6.0);
    
    for (int i = 0; i < 2; ++i) {
        shapes[i]->display();
        cout << endl;
    }
    
    // 释放内存
    for (int i = 0; i < 2; ++i) {
        delete shapes[i];
    }
    
    return 0;
}

2.3 指针与内存管理的挑战

指针和内存管理 是学习C++过程中的一大难点。指针的灵活性使其能够直接操作内存地址,但同时也带来了诸如空指针引用、内存泄漏等风险。

理解指针概念并正确运用需要花费大量时间练习和调试。在处理动态内存分配和释放时,我深刻体会到内存管理的重要性------一个不小心就可能导致程序出现难以察觉的错误甚至崩溃。通过不断实践和查阅资料,我逐渐掌握了指针使用技巧,学会了合理分配和释放内存,这也让我对计算机内存的工作机制有了更深入的认识。

现代C++提供了智能指针来简化内存管理,下面是unique_ptr和shared_ptr的使用示例:

cpp 复制代码
#include <iostream>
#include <memory> // 智能指针头文件
#include <vector>
using namespace std;

class Resource {
private:
    string name;
public:
    Resource(string n) : name(n) {
        cout << "分配资源: " << name << endl;
    }
    
    ~Resource() {
        cout << "释放资源: " << name << endl;
    }
    
    void use() {
        cout << "使用资源: " << name << endl;
    }
};

// 演示智能指针的使用
void smartPointerDemo() {
    cout << "=== unique_ptr示例 ===" << endl;
    unique_ptr<Resource> ptr1(new Resource("唯一指针"));
    ptr1->use();
    
    // 转移所有权
    unique_ptr<Resource> ptr2 = move(ptr1);
    if (!ptr1) {
        cout << "ptr1已为空" << endl;
    }
    ptr2->use();
    
    cout << "\n=== shared_ptr示例 ===" << endl;
    shared_ptr<Resource> ptr3 = make_shared<Resource>("共享资源1");
    {
        shared_ptr<Resource> ptr4 = ptr3; // 共享所有权
        cout << "引用计数: " << ptr3.use_count() << endl;
    }
    cout << "内部引用计数: " << ptr3.use_count() << endl;
}

int main() {
    smartPointerDemo();
    return 0;
}

2.4 STL标准模板库的核心组件

标准模板库 (STL)​ 是C++编程中不可或缺的部分,它提供了一系列通用的数据结构和算法。掌握STL可以极大提高编程效率和代码质量。

我最常用的STL容器包括vector、map和string,它们分别适用于不同的场景。下面是一些STL核心组件的使用示例:

cpp 复制代码
#include <iostream>
#include <vector>
#include <map>
#include <algorithm> // 算法头文件
#include <string>
using namespace std;

void stlDemo() {
    // vector示例 - 动态数组
    cout << "=== vector示例 ===" << endl;
    vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6};
    numbers.push_back(5); // 添加元素
    
    // 使用算法排序
    sort(numbers.begin(), numbers.end());
    
    // 范围for循环遍历
    cout << "排序后: ";
    for (int num : numbers) {
        cout << num << " ";
    }
    cout << endl;
    
    // map示例 - 键值对容器
    cout << "\n=== map示例 ===" << endl;
    map<string, int> studentScores;
    studentScores["Alice"] = 95;
    studentScores["Bob"] = 87;
    studentScores["Charlie"] = 92;
    
    // 遍历map
    for (const auto& pair : studentScores) {
        cout << pair.first << ": " << pair.second << endl;
    }
    
    // 算法示例 - 查找元素
    cout << "\n=== 算法示例 ===" << endl;
    auto it = find(numbers.begin(), numbers.end(), 5);
    if (it != numbers.end()) {
        cout << "找到数字5在位置: " << distance(numbers.begin(), it) << endl;
    }
    
    // lambda表达式结合算法
    cout << "大于4的数字: ";
    for_each(numbers.begin(), numbers.end(), [](int n) {
        if (n > 4) cout << n << " ";
    });
    cout << endl;
}

int main() {
    stlDemo();
    return 0;
}

2.5 Qt6实践:现代C++图形界面开发

在掌握了C++基础后,我开始探索Qt框架 ,特别是Qt6的最新特性。Qt6并非对Qt5的简单升级,而是一次面向未来的重构。

Qt6的架构有了显著革新:它重新审视了组件之间的依赖关系,引入了更清晰的模块划分;图形渲染后端全面转向Vulkan、Metal和Direct3D 12,显著提升了跨平台图形性能;同时对C++17标准的全面拥抱 ,使其能充分利用现代C++的类型推导、智能指针、lambda表达式等特性,提升代码的安全性与可读性。

在Qt6的学习中,我特别欣赏其"声明式UI "与"命令式逻辑 "的分离理念。通过QML(Qt Meta-Object Language)与C++的深度协同,开发者可以快速构建用户界面,而业务逻辑则保留在高性能的C++层中。这种分层架构不仅提高了开发效率,也为大型项目的维护和测试提供了坚实基础。

下面是一个简单的Qt6示例,展示了现代C++与Qt6的结合:

cpp 复制代码
// main.cpp - Qt6简单示例
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
#include <QMessageBox>

class MainWindow : public QWidget {
    Q_OBJECT // Qt元对象系统宏

public:
    MainWindow(QWidget *parent = nullptr) : QWidget(parent) {
        // 创建界面组件
        QLabel *label = new QLabel("欢迎使用Qt6与C++!", this);
        QPushButton *button = new QPushButton("点击我", this);
        
        // 使用lambda表达式连接信号槽
        connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
        
        // 布局管理
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(label);
        layout->addWidget(button);
        
        setWindowTitle("Qt6示例");
        resize(300, 200);
    }

private slots:
    void onButtonClicked() {
        QMessageBox::information(this, "提示", "你好,这是Qt6与现代C++的结合!");
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    
    // 现代C++特性:自动类型推导
    auto window = std::make_unique<MainWindow>();
    window->show();
    
    return app.exec();
}

#include "main.moc"

3 转向Python与轻量级大模型研究

3.1 从C++到Python的转变

随着编程视野的扩大,我开始接触Python语言 。与C++相比,Python具有更简洁的语法和丰富的生态系统,特别适合快速原型开发和研究工作。Python的动态类型和自动内存管理大大减少了开发时间,让我能更专注于算法和逻辑本身。

然而,C++的学习经历为我打下了坚实的编程基础。理解C++的底层原理 使我能更好地理解Python的内部工作机制,尤其是在性能优化和内存管理方面。两种语言的对比学习让我体会到,编程语言本质上是解决问题的工具,各有适用的场景。

下面是一个简单的Python示例,展示了与C++的语法差异:

python 复制代码
# Python的简洁语法示例
class Shape:
    def __init__(self, name):
        self.name = name
    
    def area(self):
        raise NotImplementedError("子类必须实现此方法")

class Circle(Shape):
    def __init__(self, radius):
        super().__init__("圆形")
        self.radius = radius
    
    def area(self):
        return 3.14159 * self.radius ** 2

# 使用列表推导式等Python特性
if __name__ == "__main__":
    circles = [Circle(i) for i in range(1, 5)]
    areas = [circle.area() for circle in circles]
    
    print("圆形面积:", areas)
    
    # Python字典推导式
    circle_dict = {f"圆{r}": Circle(r).area() for r in range(1, 4)}
    print("圆形字典:", circle_dict)

3.2 参数较少的大模型研究应用

在AI浪潮中,我将研究方向聚焦于参数较少的大模型 ,如讯飞Spart Lite、混元Lite等。这些模型在保持较强性能的同时,大幅减少了计算资源需求,使更多开发者能够参与大模型的研究与应用。

使用Python,我实现了这些模型的微调、推理和应用开发 。相比参数庞大的原始模型,轻量级模型在部署和推理速度上有明显优势,适合资源受限的环境。通过优化模型结构和采用知识蒸馏等技术,这些轻量级模型在特定任务上能达到与大型模型相媲美的性能。

下面是一个简化的轻量级大模型应用示例:

python 复制代码
import torch
import torch.nn as nn
from transformers import AutoModel, AutoTokenizer

class LightweightModel:
    def __init__(self, model_name="iflytek/spart-lite"):
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModel.from_pretrained(model_name)
        
    def encode_text(self, text):
        """编码文本"""
        inputs = self.tokenizer(text, return_tensors="pt", 
                              truncation=True, max_length=512)
        return inputs
    
    def get_embeddings(self, text):
        """获取文本嵌入"""
        inputs = self.encode_text(text)
        with torch.no_grad():
            outputs = self.model(**inputs)
        return outputs.last_hidden_state.mean(dim=1)  # 平均池化
    
    def semantic_similarity(self, text1, text2):
        """计算语义相似度"""
        emb1 = self.get_embeddings(text1)
        emb2 = self.get_embeddings(text2)
        similarity = torch.cosine_similarity(emb1, emb2)
        return similarity.item()

# 使用示例
if __name__ == "__main__":
    model = LightweightModel()
    
    text1 = "C++是一种高效的编程语言"
    text2 = "Python是一种简洁的脚本语言"
    
    similarity = model.semantic_similarity(text1, text2)
    print(f"语义相似度: {similarity:.4f}")

4 使用PySide6开发的C++复习题库

结合C++基础知识和Python开发经验,我最终使用PySide6(Qt for Python)开发了一个C++复习题库应用 。PySide6允许在Python中使用Qt6框架,结合了Qt的强大功能和Python的开发效率。

该题库应用具有以下特点:
覆盖全面的C++知识点 :从基础语法到高级特性,系统性地整理了大量题目和解析
智能复习计划 :根据用户的学习进度和掌握情况,动态调整复习内容和频率
代码实践环境 :集成简单的代码编辑器,支持代码编写、运行和调试
学习进度跟踪 :可视化学习进度,帮助用户清晰了解自己的掌握情况

下面是一个简化的PySide6应用示例:

python 复制代码
import sys
import json
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, 
                             QVBoxLayout, QHBoxLayout, QPushButton, 
                             QLabel, QTextEdit, QListWidget, QStackedWidget)
from PySide6.QtCore import Qt, QTimer

class CppQuizApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.questions = self.load_questions()
        self.current_question = 0
        self.score = 0
        self.init_ui()
    
    def load_questions(self):
        """加载C++题目"""
        return [
            {
                "question": "C++中如何动态分配数组?",
                "options": [
                    "使用new关键字",
                    "使用malloc函数", 
                    "使用allocate方法",
                    "使用create_array函数"
                ],
                "answer": 0,
                "explanation": "C++中使用new关键字动态分配数组,例如:int* arr = new int[10];"
            },
            {
                "question": "下面关于虚函数的描述哪个正确?",
                "options": [
                    "虚函数可以是静态的",
                    "构造函数可以是虚函数",
                    "虚函数通过vtable实现运行时多态",
                    "虚函数比普通函数执行效率更高"
                ],
                "answer": 2,
                "explanation": "虚函数通过虚函数表(vtable)实现运行时多态,这是C++多态的核心机制。"
            }
        ]
    
    def init_ui(self):
        """初始化界面"""
        self.setWindowTitle("C++复习题库")
        self.setGeometry(100, 100, 800, 600)
        
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        
        layout = QHBoxLayout(central_widget)
        
        # 左侧导航栏
        left_layout = QVBoxLayout()
        self.chapter_list = QListWidget()
        chapters = ["基础语法", "面向对象", "模板编程", "STL库", "高级特性"]
        self.chapter_list.addItems(chapters)
        left_layout.addWidget(QLabel("章节选择"))
        left_layout.addWidget(self.chapter_list)
        
        # 右侧内容区域
        right_layout = QVBoxLayout()
        self.question_label = QLabel()
        self.question_label.setWordWrap(True)
        self.question_label.setStyleSheet("font-size: 14pt; font-weight: bold;")
        
        self.options_layout = QVBoxLayout()
        
        self.explanation_text = QTextEdit()
        self.explanation_text.setReadOnly(True)
        self.explanation_text.setMaximumHeight(150)
        
        right_layout.addWidget(self.question_label)
        right_layout.addLayout(self.options_layout)
        right_layout.addWidget(QLabel("答案解析:"))
        right_layout.addWidget(self.explanation_text)
        
        # 按钮区域
        button_layout = QHBoxLayout()
        self.prev_btn = QPushButton("上一题")
        self.next_btn = QPushButton("下一题")
        self.submit_btn = QPushButton("提交答案")
        
        button_layout.addWidget(self.prev_btn)
        button_layout.addWidget(self.submit_btn)
        button_layout.addWidget(self.next_btn)
        
        right_layout.addLayout(button_layout)
        
        layout.addLayout(left_layout, 1)
        layout.addLayout(right_layout, 2)
        
        # 连接信号槽
        self.chapter_list.currentRowChanged.connect(self.change_chapter)
        self.prev_btn.clicked.connect(self.previous_question)
        self.next_btn.clicked.connect(self.next_question)
        self.submit_btn.clicked.connect(self.submit_answer)
        
        self.show_question(0)
    
    def show_question(self, index):
        """显示题目"""
        if 0 <= index < len(self.questions):
            self.current_question = index
            question = self.questions[index]
            
            self.question_label.setText(f"题目 {index + 1}: {question['question']}")
            
            # 清空选项
            for i in reversed(range(self.options_layout.count())): 
                self.options_layout.itemAt(i).widget().setParent(None)
            
            # 添加新选项
            self.option_buttons = []
            for i, option in enumerate(question['options']):
                btn = QPushButton(f"{chr(65 + i)}. {option}")
                btn.setCheckable(True)
                btn.clicked.connect(self.on_option_selected)
                self.options_layout.addWidget(btn)
                self.option_buttons.append(btn)
            
            self.explanation_text.clear()
    
    def on_option_selected(self):
        """选项选择事件"""
        for btn in self.option_buttons:
            if btn != self.sender():
                btn.setChecked(False)
    
    def submit_answer(self):
        """提交答案"""
        selected = -1
        for i, btn in enumerate(self.option_buttons):
            if btn.isChecked():
                selected = i
                break
        
        if selected == -1:
            self.explanation_text.setPlainText("请先选择一个答案!")
            return
        
        question = self.questions[self.current_question]
        if selected == question['answer']:
            self.explanation_text.setPlainText("✅ 正确!\n" + question['explanation'])
            self.score += 1
        else:
            correct_answer = chr(65 + question['answer'])
            self.explanation_text.setPlainText(
                f"❌ 错误!正确答案是: {correct_answer}\n" + question['explanation']
            )
    
    def previous_question(self):
        """上一题"""
        if self.current_question > 0:
            self.show_question(self.current_question - 1)
    
    def next_question(self):
        """下一题"""
        if self.current_question < len(self.questions) - 1:
            self.show_question(self.current_question + 1)
    
    def change_chapter(self, chapter_index):
        """切换章节"""
        # 实现章节切换逻辑
        pass

def main():
    app = QApplication(sys.argv)
    window = CppQuizApp()
    window.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

5 结语

回顾我的编程学习之旅,从C++基础到Qt图形界面开发,再到Python和AI应用,每一步都建立在之前的知识积累上。C++作为一门系统级语言,其复杂性和强大功能在学习过程中带来了挑战,但也正是这些挑战促使我不断进步和成长。

编程学习是一个螺旋式上升的过程 ,不同语言和工具之间并非相互排斥,而是可以协同增效。掌握多种编程语言和范式,能够让我们在解决问题时有更丰富的工具箱可选。

未来,我将继续探索C++在高性能计算和系统编程中的应用,同时利用Python的便捷性深入研究AI技术。两种语言的结合使用,将为解决复杂问题提供更多可能性。

相关推荐
海岸线科技1 小时前
人、智能体和机器人:麦肯锡最新报告引发的思考
人工智能·机器人·制造·质量·qms
小年糕是糕手1 小时前
【C++】类和对象(六) -- 友元、内部类、匿名对象、对象拷贝时的编译器优化
开发语言·c++·算法·pdf·github·排序算法
CQU_JIAKE1 小时前
将WSL2从C盘转移到其它盘
人工智能
lanbo_ai1 小时前
基于深度学习的宠物猫品种识别系统,resnet50,alexnet,mobilenet【pytorch框架,python代码】
人工智能·pytorch·python·深度学习·cnn
阿恩.7701 小时前
2026年2月最新国际会议分享,含计算机/教育/工程技术/电力能源/数学~
人工智能·经验分享·笔记·计算机网络·数学建模·能源
Mintopia1 小时前
🤖 AIGC技术服务商与Web平台的API对接标准与技术规范
人工智能·架构·aigc
deephub1 小时前
Gemini 2.5 Flash / Nano Banana 系统提示词泄露:全文解读+安全隐患分析
人工智能·google·大语言模型·nano banana
大佐不会说日语~1 小时前
基于Spring AI Alibaba的AI聊天系统中,流式输出暂停时出现重复插入问题的分析与解决
java·人工智能·spring
大佬,救命!!!1 小时前
C++本地配置OpenCV
开发语言·c++·opencv·学习笔记·环境配置