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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle-事务一系列理解

一个事务开始后&#xff0c;会被分配一个唯一的id号&#xff0c;xid&#xff0c;xid不仅是一个编号也是一个地址。 事务表 存在undo表空间的某一个段的段头块&#xff0c;最多存放47个事务&#xff0c;事务开始的时候&#xff0c;先将信息写入这个表&#xff0c;所以一个undo段…

【android】rk3588-android-bt

文章目录 蓝牙框架HCI接口蓝牙VENDORLIBvendorlib是什么 代码层面解读vendorlib1、 vendorlib实现&#xff0c;协议栈调用2、协议栈实现&#xff0c;vendorlib调用&#xff08;回调函数&#xff09;2.1、 init函数2.2、BT_VND_OP_POWER_CTRL对应处理2.3、BT_VND_OP_USERIAL_OPE…

Golang的API项目快速开始

开启一个简单的API服务。 golang的教程网上一大堆&#xff0c;官网也有非常详细的教程&#xff0c;这里不在赘述这些基础语法教程&#xff0c;我们意在快速进入项目开发阶段。 golang好用语法教程传送门&#xff1a; m.runoob.com/go/ 编写第一个API 前提&#xff1a;按照上一…

基于单片机的智能导盲杖设计(论文+源码)

1.系统设计 本文基于STC89C52单片机微处理器进行研究的一种智能手杖系统需要同时实现超声波自动测距、语音自动报警、距离自动显示、电机震动报警、led指示灯灯光明灭自动提醒等多种功能&#xff0c;在手机通信提醒模式下手机用户可拨打固定手机电话信号实现手机通信提醒功能。…

几款优秀科学开源计算软件介绍

有一些比较优秀的软件&#xff0c;它们在科学计算、数据处理和分析方面具有广泛的应用和功能。以下是一些比较知名的软件&#xff1a; SciPy&#xff1a;SciPy是一个非常流行的科学计算库&#xff0c;提供了大量的数学函数和算法&#xff0c;用于解决各种科学问题。它支持多种操…

互联网大厂职场各职级P6/P7和核心能力

目录 具体能力要求总结 具体能力要求 专业工匠 p5 被别人带领p6 独立完成项目全流程&#xff0c;指导 2-3 人 乐队指挥 p7 带行政团队 7-10 &#xff0c;项目团队&#xff0c;专项团队&#xff0c;复杂系统设计 1-3 个一般系统构成p8 领域专家 垂直 3 个团队 &#xff0c;横…

全志V853开发板原理图

本章节将对开发板几个主要的部件的原理图进行说明&#xff0c;方便快速上手开发板的硬件资料。 开发板硬件框图如下&#xff1a; 模块介绍 GPIO 分配 此表格为 V853 部分重要的 GPIO 的分配表&#xff0c;> 表示对IO的另外一个复用&#xff0c;完整的 GPIO 分配请参阅原理…

“数据要素×”行动计划发布,粮食安全监管如何应变?

近日&#xff0c;国家数据局发布“数据要素”三年行动计划&#xff08;2024-2026年&#xff09;&#xff0c;在“数据要素现代农业“部分提到&#xff1a;提升农业综合生产能力&#xff0c;支持农业生产经营主体和相关服务企业融合利用气象、土壤、农事作业、病虫害、市场等数据…

Open CASCADE学习|参数化球面的奇异性

参数曲面的奇异性是一个相对复杂的概念&#xff0c;它涉及到参数曲面的几何特性和参数化过程中的一些特殊情况。参数曲面通常用于描述三维空间中的复杂形状&#xff0c;通过参数方程将二维参数域映射到三维空间中。然而&#xff0c;在某些情况下&#xff0c;参数曲面可能会表现…

Python算法例35 丑数Ⅰ

1. 问题描述 丑数的定义是&#xff0c;只包含质因子2、3、5的正整数&#xff0c;例如6、8就是丑数&#xff0c;但14不是丑数&#xff0c;因为它包含了质因子7&#xff0c;本例将检测一个整数是不是丑数。 2. 问题示例 给出num8&#xff0c;返回True&#xff1b;给出num14&am…

高级路由技术案例

文章目录 案例项目一&#xff1a;1、静态ECMP和浮动静态路由配置实验2、浮动静态路由配置 案例项目二&#xff1a;使用filter-policy过滤路由案例项目三&#xff1a;IS-IS基本配置案例项目四&#xff1a;OSPF基本配置案例任务一&#xff1a;OSPF单区域配置案例任务二&#xff1…