侯捷 C++ 课程学习笔记:深入理解类与继承

发布于:2025-02-27 ⋅ 阅读:(14) ⋅ 点赞:(0)


在这里插入图片描述

每日一句正能量

有种承担,叫提得起放得下;有种负担,叫提得起放不下。向前走,走过那不属于自己的风景。潇洒的,不是唯美而是心情;收获的,不是沧桑而是淡定。因为爱我们选择离开;因为恨我们选择遗忘;因为痛我们选择隐藏;因为还有梦我们选择坚强。

一、课程背景

《C++面向对象开发》是由知名C++技术大师侯捷老师亲授的一门课程,旨在帮助学习者深入理解C++面向对象编程的核心概念和实践技巧。侯捷老师以其深厚的理论功底和丰富的实践经验,将复杂的概念讲解得通俗易懂,让学习者能够快速掌握面向对象编程的精髓。

二、学习内容:类与继承

(一)类的基本概念

类是C++面向对象编程的核心概念之一,它是一种用户自定义的数据类型,封装了数据和操作数据的函数。侯捷老师在课程中强调,类的设计应当遵循“高内聚、低耦合”的原则,即类内部的成员变量和成员函数应当紧密相关,而类与类之间应当尽量减少不必要的依赖。

1. 类的定义与实例化

class Person {
private:
    std::string name;
    int age;

public:
    void setName(const std::string& n) { name = n; }
    void setAge(int a) { age = a; }
    std::string getName() const { return name; }
    int getAge() const { return age; }
};

int main() {
    Person p;
    p.setName("Alice");
    p.setAge(20);
    std::cout << "Name: " << p.getName() << ", Age: " << p.getAge() << std::endl;
    return 0;
}

在上述代码中,Person类封装了nameage两个成员变量,并提供了相应的成员函数来操作这些变量。通过类的实例化,我们可以创建具体的对象,并通过成员函数访问和修改对象的状态。

2. 构造函数与析构函数

构造函数用于初始化对象,而析构函数用于释放对象占用的资源。侯捷老师指出,合理使用构造函数和析构函数可以有效避免内存泄漏和资源未释放的问题。

class Person {
private:
    std::string name;
    int age;

public:
    Person(const std::string& n, int a) : name(n), age(a) {}
    ~Person() { std::cout << "Person destroyed" << std::endl; }
};

int main() {
    Person p("Bob", 25);
    return 0;
}

在上述代码中,构造函数通过初始化列表对成员变量进行初始化,而析构函数在对象生命周期结束时被调用,释放资源并输出提示信息。

(二)继承

继承是面向对象编程的另一个重要特性,它允许一个类(派生类)继承另一个类(基类)的属性和方法。侯捷老师在课程中详细讲解了继承的语法和语义,并强调了继承的多态性和虚函数的重要性。

1. 单继承与多继承

C++支持单继承和多继承。单继承是指一个派生类只能继承一个基类,而多继承是指一个派生类可以继承多个基类。侯捷老师建议尽量使用单继承,因为多继承可能导致复杂的继承关系和二义性问题。

class Animal {
public:
    void eat() { std::cout << "Animal eating" << std::endl; }
};

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

int main() {
    Dog d;
    d.eat();  // 继承自Animal类
    d.bark(); // Dog类特有的方法
    return 0;
}

在上述代码中,Dog类继承了Animal类的eat方法,并添加了自己的bark方法。通过继承,Dog类可以复用Animal类的代码,减少了代码冗余。

2. 虚函数与多态

虚函数是实现多态的关键机制。侯捷老师指出,通过虚函数,派生类可以重写基类的方法,从而实现动态绑定。在运行时,程序会根据对象的实际类型调用相应的方法,而不是根据对象的声明类型。

class Animal {
public:
    virtual void makeSound() { std::cout << "Animal makes sound" << std::endl; }
};

class Dog : public Animal {
public:
    void makeSound() override { std::cout << "Dog barks" << std::endl; }
};

class Cat : public Animal {
public:
    void makeSound() override { std::cout << "Cat meows" << std::endl; }
};

int main() {
    Animal* a1 = new Dog();
    Animal* a2 = new Cat();
    a1->makeSound(); // 输出:Dog barks
    a2->makeSound(); // 输出:Cat meows
    delete a1;
    delete a2;
    return 0;
}

在上述代码中,Animal类中的makeSound方法被声明为虚函数,Dog类和Cat类分别重写了该方法。通过基类指针调用虚函数时,程序会根据对象的实际类型调用相应的方法,实现了多态。

三、学习心得

通过学习《C++面向对象开发》课程,我对面向对象编程有了更深入的理解。侯捷老师不仅讲解了类和继承的语法细节,还通过实际案例展示了面向对象编程的强大功能。我深刻认识到,面向对象编程的核心在于类的设计和继承的合理使用。通过类的封装,可以将数据和操作数据的函数紧密绑定在一起,提高代码的可维护性和可扩展性。而继承和多态则进一步增强了代码的复用性和灵活性。

在实际应用中,我尝试将面向对象的思想应用到自己的项目中。例如,在开发一个简单的图形绘制程序时,我定义了一个Shape基类,并派生出CircleRectangle等具体图形类。通过虚函数draw,我实现了多态,使得程序可以根据对象的实际类型绘制不同的图形。这种面向对象的设计不仅让代码结构更加清晰,还方便了后续的功能扩展。

四、总结

《C++面向对象开发》课程让我受益匪浅。侯捷老师深入浅出的讲解,让我对类、继承、多态等面向对象的核心概念有了更深刻的理解。通过实际案例的练习,我掌握了面向对象编程的技巧,并将其应用到自己的项目中。面向对象编程不仅是一种编程范式,更是一种思维方式。它让我学会了如何用模块化的方式解决问题,如何通过继承和多态提高代码的复用性和灵活性。在未来的学习和工作中,我将继续深入学习面向对象编程,并将其应用到更复杂的项目中,不断提升自己的编程能力。

转载自:https://blog.csdn.net/u014727709/article/details/145862799
欢迎 👍点赞✍评论⭐收藏,欢迎指正