C++学习笔记——继承和动态内存分配

目录

一、继承

二、动态内存分配

三、继承的细节

四、动态内存分配细节

五、一个动物园管理系统


继承和动态内存分配是C++中两个重要的概念

一、继承

继承是C++中面向对象编程的一个重要特性,它允许我们创建一个新类,该类从现有的类中继承属性和方法,并可以添加新的属性和方法。这样做可以提高代码的重用性和可维护性。

继承的语法格式如下:

class ChildClass : public ParentClass
{
    // 子类定义
};

在上述代码中,ChildClass 是子类,ParentClass 是父类。子类通过 : 连接符指定其继承自父类,并通过 publicprivateprotected 访问控制符来指定父类的成员对子类的可见性。

继承有三种类型:公有继承、私有继承和保护继承。公有继承表示子类可以访问父类的公共成员,私有继承表示子类只能访问父类的私有成员,保护继承表示子类可以访问父类的保护成员。

二、动态内存分配

在 C++ 中,动态内存分配可以通过 newdelete 运算符实现。动态内存分配可以使程序更加灵活,可以在程序运行时动态地分配和释放内存。

动态内存分配的基本语法如下:

new type;
delete pointer;

其中,type 表示需要分配内存的类型,可以是内置类型、指针类型或用户自定义类型。pointer 表示需要释放的指针。

使用 new 运算符分配内存时,会在堆上分配一块内存,并返回指向该内存块的指针。例如:

int* p = new int; // 动态分配一个整型变量
*p = 10; // 对指针所指向的内存进行赋值
cout << *p << endl; // 输出 10

使用 delete 运算符释放内存时,需要注意以下几点:

  • 只能释放由 new 分配的内存。
  • 被释放的指针必须指向有效的内存。
  • 避免多次释放同一块内存。

例如:

delete p; // 释放由 p 指向的内存

在使用动态内存分配时,需要注意内存泄漏和空悬指针的问题。内存泄漏指程序中分配的内存没有被及时释放,造成内存浪费;空悬指针指指向已释放的内存的指针,访问空悬指针会导致程序崩溃。

三、继承的细节

当谈到继承时,它是面向对象编程的一个重要概念。它允许我们创建一个新类,该类从现有的类中继承属性和方法,并且可以添加新的属性和方法。这种方式可以提高代码的重用性和可维护性。

在C++中,继承使用关键字class来定义子类,并使用冒号:来指定继承的父类。语法格式如下:

class ChildClass : public ParentClass
{
    // 子类定义
};

在这个例子中,ChildClass是子类,ParentClass是父类。通过使用冒号连接符,我们指定子类继承自父类。public关键字表示继承方式为公有继承。公有继承意味着子类可以访问父类的公共成员。

除了公有继承,C++还支持私有继承和保护继承。私有继承使用private关键字,表示子类只能访问父类的私有成员。保护继承使用protected关键字,表示子类可以访问父类的保护成员。

子类可以对继承下来的属性和方法进行覆盖或扩展。如果子类定义了与父类相同名称的成员函数,则子类的成员函数将覆盖父类的成员函数。如果子类需要调用父类的同名成员函数,可以使用作用域解析运算符::来指定父类的名称。

四、动态内存分配细节

是C++中另一个重要的概念,它允许在程序运行时动态地分配和释放内存。C++提供了两个相关的运算符来进行动态内存分配:newdelete

使用new运算符可以在堆上分配一块内存,并返回指向该内存块的指针。语法格式如下:

type* pointer = new type;

其中,type表示需要分配内存的类型,可以是内置类型、指针类型或用户自定义类型。pointer是一个指针,用于存储分配内存的起始地址。

例如,我们可以动态分配一个整型变量,并使用指针对其进行操作:

int* p = new int; // 动态分配一个整型变量
*p = 10; // 对指针所指向的内存进行赋值

使用delete运算符可以释放通过new分配的内存。语法格式如下:

delete pointer;

其中,pointer是要释放的指针。注意以下几点:

  • 只能释放通过new分配的内存,不能释放栈上或全局变量的内存。
  • 被释放的指针必须指向有效的内存。
  • 避免多次释放同一块内存。

例如,我们可以使用delete释放先前动态分配的整型变量:

delete p; // 释放由p指向的内存

在使用动态内存分配时,需要注意内存泄漏和空悬指针的问题。内存泄漏指的是程序中分配的内存没有被及时释放,造成内存浪费。空悬指针是指指向已释放内存的指针,访问空悬指针可能导致程序崩溃。

五、一个动物园管理系统

这个系统可以管理动物园中的不同种类的动物,包括狮子、老虎和熊,并提供一些功能,如添加动物、显示动物列表和播放动物声音。

下面是使用C++语言实现的代码示例:

#include <iostream>
#include <vector>

// 动物类
class Animal {
protected:
    std::string name;
    int age;

public:
    // 构造函数
    Animal(std::string name, int age) {
        this->name = name;
        this->age = age;
    }

    // 纯虚函数,用于播放动物声音
    virtual void makeSound() = 0;

    // 获取动物名称
    std::string getName() {
        return name;
    }

    // 获取动物年龄
    int getAge() {
        return age;
    }
};

// 狮子类,继承自动物类
class Lion : public Animal {
public:
    // 调用基类的构造函数
    Lion(std::string name, int age) : Animal(name, age) {}

    // 实现纯虚函数,播放狮子声音
    void makeSound() override {
        std::cout << "狮子的声音:Roar!" << std::endl;
    }
};

// 老虎类,继承自动物类
class Tiger : public Animal {
public:
    // 调用基类的构造函数
    Tiger(std::string name, int age) : Animal(name, age) {}

    // 实现纯虚函数,播放老虎声音
    void makeSound() override {
        std::cout << "老虎的声音:Roar!" << std::endl;
    }
};

// 熊类,继承自动物类
class Bear : public Animal {
public:
    // 调用基类的构造函数
    Bear(std::string name, int age) : Animal(name, age) {}

    // 实现纯虚函数,播放熊的声音
    void makeSound() override {
        std::cout << "熊的声音:Growl!" << std::endl;
    }
};

// 动物园管理系统类
class ZooManagementSystem {
private:
    std::vector<Animal*> animals;  // 存储动物对象的指针容器

public:
    // 添加动物
    void addAnimal(Animal* animal) {
        animals.push_back(animal);
    }

    // 显示动物列表
    void displayAnimals() {
        for (const auto& animal : animals) {
            std::cout << "名称:" << animal->getName()
                      << " 年龄:" << animal->getAge() << std::endl;
            animal->makeSound();
            std::cout << std::endl;
        }
    }
};

int main() {
    // 创建动物园管理系统对象
    ZooManagementSystem zms;

    // 创建狮子对象并添加到动物园
    Lion* lion = new Lion("Simba", 5);
    zms.addAnimal(lion);

    // 创建老虎对象并添加到动物园
    Tiger* tiger = new Tiger("Richard", 4);
    zms.addAnimal(tiger);

    // 创建熊对象并添加到动物园
    Bear* bear = new Bear("Bobby", 3);
    zms.addAnimal(bear);

    // 显示动物列表和播放声音
    zms.displayAnimals();

    // 释放动态分配的内存
    delete lion;
    delete tiger;
    delete bear;

    return 0;
}

在这个案例中,我们定义了一个基类Animal和三个派生类LionTigerBear。基类Animal包含了动物的基本属性和纯虚函数makeSound,派生类继承了基类并实现了具体的声音。

ZooManagementSystem类中,我们使用一个指针容器std::vector<Animal*>来存储动物对象的指针。通过使用动态内存分配的方式,我们创建了狮子、老虎和熊的对象,并通过addAnimal方法将它们添加到动物园。然后,我们调用displayAnimals方法显示动物的信息和播放声音。

main函数中,我们创建了一个ZooManagementSystem对象,并动态分配了狮子、老虎和熊的对象。在程序结束之前,我们使用delete运算符释放了动态分配的内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319697.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设置ubuntu命令行样式

目录 一、脚本 二、含义 三、颜色设置 四、展示 五、注意 上次为了学习ros安装了一个22.04并且做了简单的配置&#xff0c;这次我们进一步对命令行样式进行配置 ubuntu22.04安装与配置_ubuntu22.04硬件配置-CSDN博客 一、脚本 这是他的默认配置&#xff0c;太长了&#x…

Python--循环语句

在 Python 中&#xff0c;循环语句用于重复执行一段代码多次。Python 主要提供了两种类型的循环&#xff1a;for 循环和 while 循环。 1. for 循环 for 循环用于遍历可迭代对象&#xff08;如列表、元组、字典、字符串等&#xff09;中的每个元素&#xff0c;并对每个元素执行…

【每日一题】构造限制重复的字符串

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心空间复杂度&#xff1a; O ( ∑ ) O(\sum) O(∑)。 写在最后 Tag 【贪心】【字符串】【2024-01-13】 题目来源 2182. 构造限制重复的字符串 解题思路 方法一&#xff1a;贪心 思路 解题思想比较简单&#xff0c;利用贪…

C++进阶--红黑树

红黑树 一、红黑树的概念二、红黑树的性质三、红黑树结点的定义四、红黑树的插入五、红黑树的验证七、红黑树的查找七、红黑树与AVL树的比较七、完整代码RBTree.h 一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色…

IaC基础设施即代码:使用Terraform 连接 alicloud阿里云

目录 一、实验 1.环境 2.alicloud阿里云创建用户 3.Linux使用Terraform 连接 alicloud 4.Windows使用Terraform 连接 alicloud 二、问题 1.Windows如何申明RAM 相关变量 2.Linux如何申明RAM 相关变量 3. Linux terraform 初始化失败 4.Linux terraform 计划与预览失败…

关于高通Android 平台上qssi的介绍

1. QSSI 是 Qualcomm Single System Image 的缩写。 2. Android Q上开始支持QSSI。 3. QSSI 是用来编译system.img的 3.1 QSSI编译注意事项 lunch qssi ------ 编译system.img lunch target ------ 编译其余的image 3.2 有QSSI和没有QSSI的编译流程对比 没有QS…

YOLOv5独家原创改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡�…

Docker运行RabbitMQ并使用SpringAMQP操作

文章目录 一、RabbitMQ运行二、整合SpringAMQP1. 引入依赖 三、测试1. 消费者2. 生产者3. 运行 一、RabbitMQ运行 拉取docker镜像 docker pull rabbitmq:3-management基础运行命令 docker run \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_PASSrabbitmq \--name…

Vue3 如何使用移动端调试工具vConsole

1、安装 pnpm i vconsole2、在src/utils下新建vconsole.ts&#xff0c;写入以下代码 // 这是移动端控制台调试工具&#xff0c;需要调试就打开,不用就注释 import vConsole from vconsole const vconsole new vConsole()3、src/main.ts 引入&#xff0c;需要调试就打开,&…

数据结构学习之链式栈应用的案例(最小栈)

实例要求&#xff1a; 设计一个支持入栈、出栈、取栈顶元素等操作&#xff0c;并能在常数时间内检索到最小元素的栈&#xff1b; 实现 MinStack 类: MinStack* minStackCreate() 初始化堆栈对象&#xff0c;即建栈&#xff1b; void minStackPush(MinStack* obj, int val) …

DICE模型的原理与推导、碳循环与气候变化、政策评估、不确定性分析与代码分析

目录 专题一&#xff1a;DICE模型的原理与推导 专题二&#xff1a;碳循环与气候变化 专题三&#xff1a;政策评估 专题四&#xff1a;不确定性分析与代码分析 更多应用 随着温室气体排放量的增大和温室效应的增强&#xff0c;全球气候变化问题受到日益的关注。我国政府庄严…

Linux驱动学习—IIC总线之FT5X06触摸驱动实验

1、实现触摸坐标值上报 流程图&#xff1a; 设备树如下&#xff1a; 触摸设备对应的设备树节点是&#xff1a; 读取坐标的寄存器&#xff1a; #include <linux/init.h> #include <linux/module.h> #include <linux/i2c.h> #include <linux/gpio.h> #i…

【排序篇3】快速排序、归并排序

目录 一、快速排序1.1 递归1.2 非递归 二、归并排序2.1 递归2.2 非递归 一、快速排序 1.1 递归 快速排序的递归采用二叉树的前序遍历的思路&#xff0c;单趟排序先确定好一个元素的位置&#xff0c;然后往后递归再确定其他子区域内的某个元素的位置&#xff0c;直到只有一个元…

隧道应用4-内网穿透EW的简单使用

与netsh端口映射内网类似&#xff0c;也是通过跳板机实现 EW官网地址&#xff1a;http://rootkiter.com/EarthWorm EW 是一套便携式的网络穿透工具&#xff0c;具有 SOCKS v5服务架设和端口转发两大核心功能&#xff0c;可在复杂网络环境下完成网络穿透。 注&#xff1a; 考虑…

【洛谷千题详解】P7072 [CSP-J2020] 直播获奖

输入样例&#xff1a; 10 60 200 300 400 500 600 600 0 300 200 100 输出样例&#xff1a; 200 300 400 400 400 500 400 400 300 300 #include<bits/stdc.h> using namespace std; int main() {int n,w,s,a[605]{0};cin>>n>>w;for(int i1;i<n;i){sca…

P1179 [NOIP2010 普及组] 数字统计————C++

目录 [NOIP2010 普及组] 数字统计题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code1Code2运行结果 [NOIP2010 普及组] 数字统计 题目描述 请统计某个给定范围 [ L , R ] [L, R] [L,R] 的所有整数中&#xff0c;数字…

使用集群提交作业步骤

首先&#xff0c;先在terminal中创建脚本 vi job.slurmvi命令&#xff1a;打开文件 文本内容为&#xff1a; #!/bin/bash #sbatch -j test #作业名为test&#xff0c;可以自定义 #sbatch -w,--nodelist<Node1> #提交到节点1跑代码 #sbatch -o test.out #屏幕上的输出文…

java客户端连接redis并设置序列化处理

1、导入依赖 <!--继承父依赖--> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup paren…

css深度选择器 /deep/

一、/deep/的含义和使用 /deep/ 是一种 CSS 深度选择器&#xff0c;也被称为深度组合器或者阴影穿透组合器&#xff0c;主要用在 Web 组件样式封装中。 在 Vue.js 或者 Angular 中&#xff0c;使用了样式封装技术使得组件的样式不会影响到全局&#xff0c;也就是说组件内部的…

【漏洞复现】大华 DSS 数字监控系统 itcBulletin SQL 注入

漏洞描述 大华 DSS存在SQL注入漏洞,攻击者 pota/services/itcBuletin 路由发送特殊构造的数据包,利用报错注入获取数据库敏感信息。攻击者除了可以利用 SQL注入漏词获取数据库中的信息例如,管理员后台密码、站点的用户人人信息)之外,甚至在高权限的情况可向服务器中写入木…