为了账号安全,请及时绑定邮箱和手机立即绑定

C++项目经验教程:从入门到实践的进阶之路

标签:
C++

C++基础回顾

数据类型与运算符

数据类型

在C++中,数据类型定义了变量可以存储的值的类型。以下是基本的数据类型示例:

#include <iostream>

int main() {
    int a = 10;    // 整型
    float b = 10.5f; // 浮点型
    char c = 'A';   // 字符型
    bool d = true;  // 布尔型

    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;

    return 0;
}

运算符

C++提供了丰富的运算符,用于各种数学和逻辑操作。以下是一些基本的运算符示例:

#include <iostream>

int main() {
    int x = 5, y = 3, z = 2;

    std::cout << "Addition: " << x + y << std::endl;
    std::cout << "Subtraction: " << x - y << std::endl;
    std::cout << "Multiplication: " << x * y << std::endl;
    std::cout << "Division: " << x / y << std::endl;
    std::cout << "Modulus: " << x % y << std::endl;

    bool condition = (x > y) && (y < z);
    std::cout << "Logical AND: " << condition << std::endl;

    return 0;
}

面向对象编程

类与对象

在C++中,类是定义具有特定属性和行为的对象的模板。下面是一个简单的类定义示例:

#include <iostream>

class Circle {
public:
    float radius;
    void setRadius(float r) {
        radius = r;
    }
    float getArea() const {
        return 3.14 * radius * radius;
    }
};

int main() {
    Circle c;
    c.setRadius(5);
    std::cout << "Area of circle: " << c.getArea() << std::endl;
    return 0;
}

封装

封装是将数据和操作数据的函数封装在一起,以隐藏实现细节。上述代码中,Circle类的radius属性和getArea函数都封装在类内部。

继承与多态

继承允许创建新类,该类继承现有类的属性和行为。多态则是允许不同类的对象对同一种消息做出响应。

#include <iostream>

class Shape {
public:
    virtual float area() const = 0; // 抽象函数
};

class Circle : public Shape {
private:
    float radius;
public:
    Circle(float r) : radius(r) {}
    float area() const override {
        return 3.14 * radius * radius;
    }
};

class Rectangle : public Shape {
private:
    float width, height;
public:
    Rectangle(float w, float h) : width(w), height(h) {}
    float area() const override {
        return width * height;
    }
};

int main() {
    Circle c(5);
    Rectangle r(4, 6);
    std::cout << "Circle area: " << c.area() << std::endl;
    std::cout << "Rectangle area: " << r.area() << std::endl;
    return 0;
}

指针与内存管理

指针概念

指针在C++中是一种用于存储内存地址的变量。下面是一个使用指针的例子:

#include <iostream>

int main() {
    int a = 10;
    int *p = &a; // p 指向 a 的内存地址

    std::cout << "Value of a: " << *p << std::endl;
    *p = 15; // 通过指针修改 a 的值
    std::cout << "Value of a after modification: " << *p << std::endl;

    return 0;
}

动态内存分配

动态内存分配允许程序在运行时分配和释放内存。使用newdelete操作符:

#include <iostream>

int main() {
    int *p;
    p = new int(10); // 动态分配内存

    std::cout << "Value of dynamically allocated memory: " << *p << std::endl;

    delete p; // 释放内存

    return 0;
}

析构函数

析构函数在对象销毁时自动调用,用于清理资源。定义析构函数时,前缀为~:

#include <iostream>

class MyClass {
public:
    ~MyClass() {
        std::cout << "Object destroyed." << std::endl;
    }
};

int main() {
    MyClass obj;
    return 0;
}

异常处理

异常处理机制允许代码更优雅地处理错误。使用try, catchthrow

#include <iostream>

void divide(int a, int b) {
    if (b == 0) throw std::runtime_error("Divide by zero error.");
    std::cout << "Result: " << a / b << std::endl;
}

int main() {
    try {
        divide(10, 0);
    } catch (const std::exception& e) {
        std::cerr << "Exception caught: " << e.what() << std::endl;
    }
    return 0;
}

标准模板库(STL)

容器

STL容器是用于存储元素的模板类。以下是一个使用vector的例子:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3};
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

算法与迭代器

STL提供了丰富的算法和迭代器,用于高效地操作容器。以下使用sort算法:

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> vec = {3, 1, 2};
    std::sort(vec.begin(), vec.end());

    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

项目实战案例

问题描述

假设我们要开发一个简单的日程管理应用,用于存储、查询和修改每日任务。

解决方案设计

  • 数据模型:任务(标题、描述、截止日期、完成状态)。
  • 功能:添加任务、删除任务、查询任务、更新任务状态。

代码实现

#include <iostream>
#include <vector>
#include <string>

class Task {
public:
    std::string title;
    std::string description;
    std::string dueDate;
    bool completed;

    Task(const std::string& title, const std::string& description, const std::string& dueDate, bool completed) :
        title(title), description(description), dueDate(dueDate), completed(completed) {}
};

class Calendar {
private:
    std::vector<Task> tasks;

public:
    void addTask(const Task& task) {
        tasks.push_back(task);
    }

    void removeTask(const std::string& title) {
        for (auto it = tasks.begin(); it != tasks.end(); ++it) {
            if (it->title == title) {
                tasks.erase(it);
                break;
            }
        }
    }

    void queryTask(const std::string& title) {
        for (const Task& task : tasks) {
            if (task.title == title) {
                std::cout << "Title: " << task.title << std::endl;
                std::cout << "Description: " << task.description << std::endl;
                std::cout << "Due Date: " << task.dueDate << std::endl;
                std::cout << "Completed: " << (task.completed ? "Yes" : "No") << std::endl;
                return;
            }
        }
        std::cout << "Task not found." << std::endl;
    }

    void updateTaskStatus(const std::string& title, bool completed) {
        for (auto& task : tasks) {
            if (task.title == title) {
                task.completed = completed;
                break;
            }
        }
    }
};

int main() {
    Calendar calendar;

    Task task1("Buy groceries", "Prepare a shopping list", "2023-10-01", false);
    Task task2("Finish project", "Revise code sections", "2023-10-02", false);

    calendar.addTask(task1);
    calendar.addTask(task2);

    calendar.queryTask("Buy groceries");
    std::cout << std::endl;

    calendar.updateTaskStatus("Buy groceries", true);
    calendar.queryTask("Buy groceries");

    return 0;
}

通过这个案例,读者能够将学习的C++知识应用于实际项目,理解如何设计和实现基本的应用逻辑,以及如何利用STL容器和算法来简化代码、提高效率。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消