编程世界的魅力在于,既要深入理解计算机系统的本质,又要不断拥抱新技术浪潮
一、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技术。两种语言的结合使用,将为解决复杂问题提供更多可能性。
