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

news2024/9/25 15:25:34

目录

一、继承

二、动态内存分配

三、继承的细节

四、动态内存分配细节

五、一个动物园管理系统


继承和动态内存分配是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运算符释放了动态分配的内存。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多区域isis配置实验

一、预习&#xff1a; IS-IS&#xff1a;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff0c;是ISO为它的CLNP&#xff08;ConnectionLess Network Protocol&#xff09;设计的一种动态路由协议&#xff0c;后来为了提供对IP路由的支持&…

Kali安装Xrdp结合内网穿透实现无公网ip远程访问系统桌面

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于&#xff0c;它允许用户从远程位置访问Kali系统&#xff0c;而无需直接物理访…

设置ubuntu命令行样式

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

开源 UI 组件库和开发工具库概览 | 开源专题 No.59

ant-design/ant-design Stars: 87.9k License: MIT Ant Design 是一个企业级 UI 设计语言和 React UI 库。 为 Web 应用程序设计的企业级 UI。提供一套高质量的开箱即用的 React 组件。使用可预测静态类型编写 TypeScript 代码。包含完整的设计资源和开发工具包。支持数十种语…

【Databend】行列转化:数据透视和逆透视

文章目录 数据准备数据透视数据逆透视总结 数据准备 学生学科得分等级测试数据如下&#xff1a; drop table if exists fact_suject_data; create table if not exists fact_suject_data (student_id int null comment 编号,subject_level varchar null comment …

web3d-three.js场景设计器-sprite广告牌

three.js使用Sprite精灵实现文字或者图片广告牌1.将文字绘制到Canvas&#xff0c;调整对应宽高。2.作为Cavans材质绑定到Sprite3.加载到场景调整适当的scale function createLabel({ text, fontSize, textColor, color, imageUrl }) { return new Promise((resolve, reject) &…

5.3 Verilog 带参数例化

5.3 Verilog 带参数例化 分类 Verilog 教程 关键词&#xff1a; defparam&#xff0c;参数&#xff0c;例化&#xff0c;ram 当一个模块被另一个模块引用例化时&#xff0c;高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块…

腾讯云免费服务器怎么申请?腾讯云免费服务器申请难吗?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

Python中使用execfile实现R中的source功能,避免重复加载包导入函数

R中避免重复 在R中要加载多个包&#xff0c;进行全局的配置&#xff0c;定义全局变量&#xff0c;我们可以下一个config.R文件&#xff0c;在分析的代码开头source一下这个config.R文件即可避免每次都要加载包的冗余代码 using是之前定义的一个函数&#xff0c;作用是一次性加…

如何异地链接Pycharm服务器进行远程开发并实现与公司服务器资源同步

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

【数据结构之树和二叉树】

数据结构学习笔记---007 数据结构之树和二叉树概念篇1、树的概念和结构1.1、树的相关概念1.2、树的存储结构 2、二叉树概念及结构2.1、二叉树概念2.2、满二叉树2.3、完全二叉树2.4、满二叉树或完全二叉树的存储形式 3、堆的概念及结构3.1、堆的性质3.2、堆的意义 4、二叉树的存…

考研复试复习-数据库原理(2关系数据库)

一、关系数据模型 1、关系数据结构 (1) 域、笛卡尔积、关系 笛卡尔积实际上可以看成是n个行向量&#xff0c;即&#xff08;域&#xff09;&#xff0c;所组成的一个乘法算式&#xff0c;每一个行向量是一个Di&#xff0c;所有行向量逻辑上组合在一起就是D&#xff0c;就是一…

fisco-bcos部署pro生产版本

我这里使用的 Ubuntu20.4系统&#xff0c;linux系统把操作命令apt改为yum即可 升级安装包 apt-get update 安装jdk&#xff0c;我这里使用jdk17 apt -y install openjdk-17-jdk-headless 查看java版本 java -version 安装依赖 apt-get install -y curl docker.io docker-com…

数据库-数据结构

数据库-数据结构 一、B-树、B树、B*树1 B-树2 B树3 B*树 一、B-树、B树、B*树 搜索树&#xff1a;左子节点<节点<右子节点。 B-树&#xff1a;多路搜索树。 B树&#xff1a;B-树的变体&#xff0c;更适用于文件系统&#xff0c;如mysql数据库。具体的&#xff0c;适合通…

SAP SQVI制作报表及SE93创建事务代码

在平时的项目中&#xff0c;财务想查询所有的凭证明细&#xff0c;SAP的查询凭证FB03不能满足需求&#xff0c;所以用SQVI制作一个简易的查询报表。 1、打开SQVI&#xff0c;填写自开发报表的名称“ZFB03”&#xff0c;点击“创建”&#xff0c;输入自开发报表的名称“凭证明细…

腾讯云免费服务器-多规格高配服务器0元试用,开箱即用

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

小程序开发哪家公司好呢?

现在的小程序开发公司还是很多的&#xff0c;不同的开发公司的开发情况会有所不同 智创有术 国内定制开发行业的佼佼者&#xff0c;曾服务过众多知名企业&#xff0c;包括沃尔玛、富士康、百度、美的等多家五百强企业。他们提供移动应用开发、Web开发、云计算和UI/UX设计等服…

2024年百元到千元价位开放式耳机推荐,性价比最高的开放式耳机

一、前言 近年来&#xff0c;开放式耳机在人们对音频体验的追求中逐渐受到重视&#xff0c;成为越来越多人的选择。然而&#xff0c;随着网络上关于开放式耳机的讨论不断增加&#xff0c;相关的争议和观点层出不穷。很多人可能心生疑虑&#xff1a;开放式耳机究竟是提升音质还…

2.右值引用和移动语义

文章目录 右值引用和移动语义&&的特性右值引用优化性能&#xff0c;避免深拷贝移动(move )语义forward 完美转发emplace_back 减少内存拷贝和移动unordered container 无序容器map和unordered_map的差别内部实现机理不同优缺点以及适用处 小结优缺点以及适用处 小结 代…

激光雷达产品调研

Lidar产品调研 Lidar原理介绍