首页 > 编程语言 >C++ (4) 面向对象编程,C++的魔法生物养成记

C++ (4) 面向对象编程,C++的魔法生物养成记

时间:2024-10-26 19:18:17浏览次数:3  
标签:std name breatheFire 魔法 C++ Dragon 生物 面向对象编程

面向对象编程:C++的魔法生物养成记

在C++的世界里,面向对象编程(OOP)就像是魔法生物的养成游戏。你将扮演一名魔法师,通过编写代码来创造和培养自己的魔法生物。这些生物拥有自己的属性(数据)和能力(函数),它们可以在你的程序世界中自由行动和互动。现在,让我们拿起魔杖(键盘),开始这场魔法生物养成之旅吧!

3. 面向对象编程:创造你的魔法生物

3.1 类和对象:定义魔法生物的蓝图

在面向对象编程中,类是定义魔法生物的蓝图。它规定了生物的属性(数据成员)和能力(成员函数)。对象则是根据类创建的实例,每个对象都有自己的属性和能力。

下面是一个简单的类定义示例:

class Dragon {
public:
    // 构造函数,给魔法生物起名
    Dragon(std::string name) : name_(name) {}

    // 成员函数,让龙喷火
    void breatheFire() {
        std::cout << name_ << "喷出火焰!" << std::endl;
    }

private:
    std::string name_; // 龙的名字,私有属性
};

int main() {
    Dragon myDragon("烈焰"); // 创建一个名为“烈焰”的龙对象
    myDragon.breatheFire(); // 让龙喷火
    return 0;
}

在这个例子中,我们定义了一个Dragon类,它有一个私有属性name_和一个公共成员函数breatheFire。然后,我们创建了一个名为“烈焰”的龙对象,并调用了它的breatheFire函数。

3.2 封装:隐藏魔法生物的秘密

封装是面向对象编程的核心概念之一,它允许你将数据(属性)和操作数据的函数(方法)捆绑在一起,并隐藏内部实现细节。这就像是给魔法生物施加了一个保护咒语,防止外部直接访问它的属性。

在上面的Dragon类示例中,name_属性是私有的,这意味着它只能在类的内部被访问。外部代码必须通过公共成员函数来访问和修改这个属性。

3.3 继承:创造魔法生物的进化树

继承允许你创建新的类,继承现有类的属性和方法,并添加或覆盖它们。这就像是魔法生物的进化,新的生物种类可以继承旧的种类的特性,并发展出自己的独特能力。

下面是一个使用继承的示例:

class FireDragon : public Dragon {
public:
    FireDragon(std::string name) : Dragon(name) {}

    // 覆盖父类的喷火方法
    void breatheFire() {
        std::cout << name_ << "喷出炽热的火焰!" << std::endl;
    }
};

int main() {
    FireDragon myFireDragon("炽焰"); // 创建一个火龙对象
    myFireDragon.breatheFire(); // 让火龙喷火
    return 0;
}

在这个例子中,FireDragon类继承自Dragon类。它覆盖了父类的breatheFire方法,以展示火龙独特的炽热火焰。

3.4 多态:让你的魔法生物变换形态

多态允许你定义一个通用的接口,并通过不同的类来实现这个接口的具体行为。这就像是让你的魔法生物在不同的情况下变换形态。

下面是一个使用多态的示例:

class IceDragon : public Dragon {
public:
    IceDragon(std::string name) : Dragon(name) {}

    // 实现喷火方法,但喷出的是冰霜
    void breatheFire() {
        std::cout << name_ << "喷出冰霜!" << std::endl;
    }
};

void makeDragonBreatheFire(Dragon& dragon) {
    dragon.breatheFire(); // 调用龙的喷火方法
}

int main() {
    Dragon myDragon("烈焰");
    FireDragon myFireDragon("炽焰");
    IceDragon myIceDragon("冰霜");

    makeDragonBreatheFire(myDragon);   // 输出:烈焰喷出火焰!
    makeDragonBreatheFire(myFireDragon); // 输出:炽焰喷出炽热的火焰!
    makeDragonBreatheFire(myIceDragon);  // 输出:冰霜喷出冰霜!
    return 0;
}

在这个例子中,makeDragonBreatheFire函数接受一个Dragon类型的引用,并调用它的breatheFire方法。由于多态,不同的龙对象会调用各自对应的breatheFire方法。

3.5 构造函数和析构函数:魔法生物的诞生与消亡

构造函数是在创建对象时自动调用的特殊函数,它用于初始化对象的属性。析构函数则是在对象销毁时自动调用的函数,它用于释放对象占用的资源。

下面是一个包含构造函数和析构函数的示例:

class Dragon {
public:
    Dragon(std::string name) : name_(name) {
        std::cout << name_ << "诞生了!" << std::endl;
    }

    ~Dragon() {
        std::cout << name_ << "消失了!" << std::endl;
    }

    void breatheFire() {
        std::cout << name_ << "喷出火焰!" << std::endl;
    }

private:
    std::string name_;
};

int main() {
    {
        Dragon myDragon("烈焰"); // 输出:烈焰诞生了!
        myDragon.breatheFire();   // 输出:烈焰喷出火焰!
    } // myDragon对象被销毁,输出:烈焰消失了!
    return 0;
}

在这个例子中,当Dragon对象被创建时,构造函数会被调用,并打印出生信息。当对象被销毁时,析构函数会被调用,并打印消失信息。

3.6 静态成员和友元:魔法生物的宝物和朋友

静态成员是属于类的成员,而不是属于某个特定对象的。友元则是被允许访问类的私有或保护成员的外部函数或类。

下面是一个使用静态成员和友元的示例:

class Dragon {
public:
    static int count; // 静态成员,用于统计龙的数量

    Dragon(std::string name) : name_(name) {
        count++; // 每创建一个龙对象,计数增加
        std::cout << name_ << "诞生了!" << std::endl;
    }

    ~Dragon() {
        count--; // 每销毁一个龙对象,计数减少
        std::cout << name_ << "消失了!" << std::endl;
    }

    void breatheFire() {
        std::cout << name_ << "喷出火焰!" << std::endl;
    }

private:
    std::string name_;
    friend class DragonKing; // 声明DragonKing为友元类
};

int Dragon::count = 0; // 初始化静态成员

class DragonKing {
public:
    void commandDragon(Dragon& dragon) {
        dragon.breatheFire(); // 友元类可以访问Dragon的私有成员
    }
};

int main() {
    Dragon myDragon("烈焰"); // 输出:烈焰诞生了!
    DragonKing king;
    king.commandDragon(myDragon); // 输出:烈焰喷出火焰!
    return 0;
}

在这个例子中,Dragon类有一个静态成员count,用于统计龙的数量。DragonKing类被声明为Dragon的友元类,因此它可以访问Dragon的私有成员。

结语

面向对象编程就像是在C++的魔法世界中创造和培养自己的魔法生物。通过类和对象,你可以定义生物的属性和能力;通过封装、继承和多态,你可以让生物拥有独特的特性和行为;通过构造函数和析构函数,你可以控制生物的诞生和消亡;通过静态成员和友元,你可以让生物拥有宝物和朋友。

现在,拿起你的键盘,继续在C++的魔法世界中创造和探索吧!愿你的魔法生物强大而独特,愿你在编程的征途上充满乐趣和惊喜

标签:std,name,breatheFire,魔法,C++,Dragon,生物,面向对象编程
From: https://blog.csdn.net/weixin_39346529/article/details/143210924

相关文章

  • C++ (7) 内存管理:掌握魔法能量的流动
    内存管理:掌握魔法能量的流动在C++的魔法世界中,内存管理是一项至关重要的技能。它涉及到程序如何分配和释放内存资源。如果处理不当,可能会导致程序崩溃或内存泄漏,就像一个魔法师失去了对魔法能量的控制。现在,让我们学习如何成为一个负责任的魔法师,掌握内存管理的艺术。6.......
  • 【C++ 图论 DFS】1443. 收集树上所有苹果的最少时间|1682
    本文涉及知识点C++图论C++DFSLeetCode1443.收集树上所有苹果的最少时间给你一棵有n个节点的无向树,节点编号为0到n-1,它们中有一些节点有苹果。通过树上的一条边,需要花费1秒钟。你从节点0出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点0。无向......
  • 【深搜】桐桐的组合(devc++)
    【问题描述】排列与组合是常用的数学方法,桐桐刚刚学会了全排列,就想试试组合,组合就是从n 个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n 个元素理解为自然数1,2,…,n ,从中任取r 个数。【输入格式】两个整数n 和r(1≤r≤n≤20)。【输出格式】输出所有的组......
  • C++试卷带答案
    选择题(1)关于重载函数在调用时匹配依据的说法中,错误的是 (1)  。A)参数个数        B)参数的类型       C)函数名字        D)函数的类型(2)下面对友元函数描述正确的是(2)。A)友元函数的实现必须在类的内部定义B)友元函数是类的成员函......
  • 【C++】map和set的使用
    最好的,不一定是最合适的;最合适的,才是真正最好的。......
  • C++:继承与多态(面试题篇)
    文章目录前言1.什么是多态?2.什么是重载、重写(覆盖)、重定义(隐藏)?3.多态的实现原理?4.inline函数可以是虚函数吗?5.静态成员可以是虚函数吗?6.构造函数可以是虚函数吗?7.析构函数可以是虚函数吗?什么场景下析构函数是虚函数?8.对象访问普通函数快还是虚函数更快?9.虚......
  • C++中vector的使用方法
    1包含头文件和命名空间首先,在使用vector之前,需要包含<vector>头文件。在C++中,如果使用标准命名空间,还需要加上usingnamespacestd;语句(不过这种全局使用命名空间的方式在大型项目中可能会引起命名冲突,也可以只使用std::vector来明确指定是标准库中的vector类型)。示例:#......
  • C++各版本引入的新特性
    作者:momo链接:https://www.zhihu.com/question/355400393/answer/3245544440来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。以下是C++各个版本的标准库特性:C++98:引入了以下新的库特性:RTTI(运行时类型信息),包括dynamic_cast和typeid类型转换......
  • 每日OJ题_牛客_NC383主持人调度(一)_排序​_C++_Java
    目录牛客_NC383主持人调度(一)_排序题目解析C++代码Java代码牛客_NC383主持人调度(一)_排序主持人调度(一)_牛客题霸_牛客网(nowcoder.com)描述:        有n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第i 个活动的开始时间是starti ,第i 个活动......
  • 详解c++中的set_difference函数
    set_difference功能描述:求两个集合的差集函数原型:set_difference(iteratorbeg1,iteratorend1,iteratorbeg2,iteratorend2,iteratordest);//求两个集合的差集//注意:两个集合必须是有序序列//beg1容器1开始迭代器//end1容器1结束迭代器//beg2容......