39 C++ 进阶到上手实战教程

39 C++ 进阶到上手实战教程

在本节中,我们将学习如何将 C++ 语言的核心功能应用于实际项目中。我们将以一个简单的项目为例,逐步实现其核心功能。

项目背景

我们将创建一个简单的图书管理系统,该系统可以实现图书的添加、删除和查询功能。此项目主要展示如何使用 对象标准模板库 (STL)

小节一:定义图书类

我们首先需要定义一个 Book 类,以表示图书的基本信息。

实现 Book

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <string>

class Book {
private:
std::string title;
std::string author;
int year;

public:
// 构造函数
Book(const std::string& title, const std::string& author, int year)
: title(title), author(author), year(year) {}

// 获取书名
std::string getTitle() const {
return title;
}

// 获取作者
std::string getAuthor() const {
return author;
}

// 获取出版年份
int getYear() const {
return year;
}

// 显示图书信息
void display() const {
std::cout << "书名: " << title
<< ", 作者: " << author
<< ", 出版年份: " << year << std::endl;
}
};

注释

  • Book 类中,titleauthoryear 是该图书的属性。
  • 我们提供了相应的构造函数和方法来访问这些属性。

小节二:创建图书库

接下来,我们需要一个可以存储多个书籍的 Library 类。

实现 Library

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <vector>
#include <algorithm>

class Library {
private:
std::vector<Book> books;

public:
// 添加图书
void addBook(const Book& book) {
books.push_back(book);
}

// 删除图书
void removeBook(const std::string& title) {
books.erase(std::remove_if(books.begin(), books.end(),
[title](const Book& book) {
return book.getTitle() == title;
}), books.end());
}

// 查询图书
void searchBook(const std::string& title) const {
for (const auto& book : books) {
if (book.getTitle() == title) {
book.display();
return;
}
}
std::cout << "未找到书名为 \"" << title << "\" 的图书。" << std::endl;
}

// 显示所有图书
void displayAllBooks() const {
for (const auto& book : books) {
book.display();
}
}
};

注释

  • Library 类使用 std::vector 来存储 Book 对象。
  • 提供了 addBookremoveBooksearchBook 方法,以便进行图书的管理。

小节三:主程序逻辑

现在,我们将实现主程序入口,来使用上述 Library 类。

实现主函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

int main() {
Library library;

// 添加图书
library.addBook(Book("C++ Primer", "Stanley B. Lippman", 2005));
library.addBook(Book("Effective C++", "Scott Meyers", 2005));
library.addBook(Book("The C++ Programming Language", "Bjarne Stroustrup", 2013));

// 显示所有图书
std::cout << "已添加的图书:" << std::endl;
library.displayAllBooks();

// 查询图书
std::cout << "\n查询图书:" << std::endl;
library.searchBook("C++ Primer");

// 删除图书
std::cout << "\n删除图书:" << std::endl;
library.removeBook("Effective C++");
library.displayAllBooks();

return 0;
}

注释

  • 在主函数中,我们首先创建一个 Library 对象并添加几本书。
  • 然后,我们显示所有图书,查询特定书籍,删除一本书并再显示剩余的书籍。

结尾总结

通过上述步骤,我们实现了一个简单的图书管理系统的核心功能。关键环节如 的设计、STL 容器的使用和 Lambda 表达式的运用等,都是这个项目的重要组成部分。希望这个案例能够帮助你在 C++ 开发中更进一步。在实际项目中,你还可以扩展更多功能,比如文件存储、用户交互等,更加丰富你的项目实现。

40 C++ 进阶到上手实战教程

40 C++ 进阶到上手实战教程

小节项目测试、优化与部署

在C++的开发过程中,测试、优化与部署是确保程序高效、稳定运行的重要环节。下面我们将详细探讨这几个方面。

1. 项目测试

1.1 单元测试

单元测试是确保代码正确性的重要手段。C++中常用的单元测试框架有Google Test、Catch2等。

案例:使用Google Test进行单元测试

  1. 安装Google Test。

  2. 创建一个简单的C++函数:

    1
    2
    3
    4
    // example.cpp
    int add(int a, int b) {
    return a + b;
    }
  3. 编写测试代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // test_example.cpp
    #include <gtest/gtest.h>
    extern "C" {
    int add(int a, int b);
    }

    TEST(AddTest, PositiveNumbers) {
    EXPECT_EQ(add(1, 2), 3);
    }

    TEST(AddTest, NegativeNumbers) {
    EXPECT_EQ(add(-1, -2), -3);
    }
  4. 编译并运行测试:

    1
    2
    g++ -isystem path/to/googletest/include -pthread example.cpp test_example.cpp libgtest.a -o test_example
    ./test_example

1.2 集成测试

集成测试旨在验证多个组件协同工作时的功能。可以手动编写集成测试用例,或使用自动化测试框架。

2. 性能优化

在C++中,性能优化通常涉及到以下几个方面:

2.1 代码优化

  • 使用合适的数据结构:选择合适的数据结构(如std::vectorstd::map等)可以显著提高性能。
1
2
3
4
5
6
7
8
#include <vector>

void example_function() {
std::vector<int> vec;
for (int i = 0; i < 1000000; ++i) {
vec.push_back(i); // 如果频繁插入元素,考虑使用预分配
}
}
  • 减少不必要的拷贝:使用引用或指针传递大对象。
1
void processLargeObject(const LargeObject& obj) { /* ... */ }

2.2 编译优化

使用编译优化选项来提高代码性能。例如,使用-O2-O3编译选项。

1
g++ -O2 example.cpp -o example

2.3 运行时优化

  • 性能分析:可以使用工具(如gprofValgrindPerf等)分析程序的性能瓶颈。
1
2
3
g++ -pg -o example example.cpp    # 使用gprof进行性能分析
./example
gprof example gmon.out > analysis.txt

3. 部署

3.1 构建与打包

将项目打包成可分发的格式是部署的重要步骤。可以使用CMakeMakefile等构建工具。

使用CMake构建项目

  1. 创建CMakeLists.txt

    1
    2
    3
    cmake_minimum_required(VERSION 3.10)
    project(ExampleProject)
    add_executable(example example.cpp)
  2. 创建构建目录并进行构建:

    1
    2
    3
    4
    mkdir build
    cd build
    cmake ..
    make

3.2 部署到目标环境

确认所需的运行时库已在目标环境中安装。可以创建脚本自动化部署过程。

1
2
3
4
#!/bin/bash
# deploy.sh
scp ./example user@target-server:/path/to/deploy/
ssh user@target-server "chmod +x /path/to/deploy/example"

3.3 版本控制与发布

使用Git进行版本控制,确保代码版本的可追溯性。可以使用Git标签发布版本。

1
2
git tag -a v1.0 -m "Release version 1.0"
git push origin v1.0

小结

在C++的实战开发中,项目测试性能优化部署都是必不可少的环节。掌握这些技能,可以极大提高项目的质量和稳定性。希望本节能够帮助您深入理解这些主题,并在实际项目中加以运用。