分享

与LSGO一起学“14 数组(14.24 复习:堆中对象)”

 老马的程序人生 2020-08-17

14.24 复习:堆中对象

通常的情况下,我们都明白我们的程序需要几个对象来实现,因此当我们声明一个对象数组并确定对象数量的时候,编译器会根据我们声明的对象数量来留出空间。但是有的时候我们也不能精确地判断程序需要使用几个对象,那么我们就需要使用更高级的数据结构了。在讨论数据结构之前,我们先来理解几个概念。

1.堆中对象

前面我们所讲的数组都是存放在栈中,一般来说栈的内存是有限的,但是堆的内存则很大。这样为了避免栈的内存开销,我们可以在堆中存放数据。

比如说我们把整个对象都存放在堆中,那么在堆区中声明一个对象的方法是:

Area *one = new Area;

关键词new是一个操作符,它可以在堆中开辟一块新空间,空间大小由new后面的类型来决定。本例中new后面的类型为Area,Area是个类,因此会调用该类的构造函数构造一个属于Area类的对象,这个对象就保存到new开辟的空间中。由于堆中的所有东西都是匿名的,它没有名字,不能按名字访问,只能通过指针(one)访问,所以还需要声明一个指针,赋值运算符的左边声明了一个指向堆中对象的指针one,由于该对象的类型为Area,所以将其声明为指向Area类对象的指针,这样就可以通过该指针找到堆中对象。

另外需要注意的是,在堆区中创建一个新对象也可以同时进行初始化工作,如:

Area *one = new Area(10,20);

//构造一个带有2个参数的Area对象并对其进行初始化

Area *one = new Area(10);

//构造一个带有1个参数的Area对象并对其进行初始化

Area *one = new Area(i,i * 2);

// 构造一个带有2个参数的Area对象并通过表达式对其进行初始化

本节我们利用堆将上节的计算面积程序重写一下,由于堆可以存放较大的数据,因此我们将循环的次数定义10000次,也就是每循环一次创建一个对象,一共创建10000个对象,然后用该对象访问类中的函数并返回一个值。另外我们需要说明的是,一个对象的大小是由它所包含的变量决定的,假如该对象拥有2个占4个字节的整型变量,那么该对象就占用8个字节。该例中我们的对象拥有2个int型变量,因此这个对象占8个字节,我们一共循环创建了10000个对象,那么假如不将其释放的话,就是占用了80000个字节的内存。

程序演示:

#include<iostream>

#include"Area.h"

using namespace std;

int main()

{

    for(int i=0;i<10000;i++)

    {

       Area *one = new Area(i,i * 2);

       cout <<"Area["<<i <<"]:";

       cout <<one->getArea() <<endl;

       delete one;

       one = 0;

       //system("pause");

    }

    return 0;

}


与LSGO一起学系列图文之 C++

第1章 初识C++

   1.1 C++简介

   1.2 C++的发展过程

   1.3 C++与C有什么不同

   1.4 学习C++之前需要先学C吗?

   1.5 C++与其他语言的区别

   1.6 Visual Studio 2010编译器

第2章 做一个简短的C++程序

   2.1 简单的屏幕输出小程序

   2.2 输出语句的使用

   2.3 std::介绍

   2.4 iostream与iostream.h的区别

   2.5 重名问题

   2.6 注释

   与LSGO一起学“C++上机小练习01”

第3章 初步了解函数

   3.1 一个简单的函数

   3.2 函数的参数

   3.3 函数的返回值、参数与变量

   3.4 函数的声明与定义

   3.5 局部变量

   3.6 全局变量

   与LSGO一起学“C++上机小练习02”

第4章 C++数据类型

   4.1 C++数据类型引入

   4.2 什么是变量

   4.3 变量及数据如何存储在内存上

   4.4 布尔型

   4.5 字符型

   4.6 双字节型

   4.7 整型概述

   4.8 为什么使用补码

   4.9 整型变量的定义

   4.10 浮点型变量

   4.11 常量

   4.12 枚举型常量

   与LSGO一起学“C++上机小练习03”

第5章 if语句与逻辑运算符

   5.1 什么是语句

   5.2 什么是块

   5.3 什么是表达式

   5.4 什么是运算符

   5.5 赋值运算符与数学运算符的联合

   5.6 什么是自加与自减

   5.7 表达式的优先级

   5.8 关系运算符

   5.9 if语句

   5.10 else语句

   5.11 else if语句

   5.12 if语句的嵌套

   5.13 带括号的嵌套语句

   5.14 逻辑“与”运算符

   5.15 逻辑“或”运算符

   5.16 逻辑“非”运算符

   5.17 逻辑运算符的优先级

   5.18 运算式的真假关系

   5.19 三目运算符

   5.20 三目运算符的优先问题

   5.21 三目运算符的使用问题

   5.22 三目运算符的型别问题

   5.23 三目运算符在字符型变量中的使用

   5.24 复杂的嵌套if语句

   5.25 逗号运算符

   与LSGO一起学“C++上机小练习04”

   与LSGO一起学“C++上机小练习05”

第6章 面向对象

   6.1 什么是面向对象程序语言

   6.2 面向对象程序语言的主要特征

   6.3 什么是类,对象和成员

   6.4 声明一个类

   6.5 命名习惯

   6.6 定义一个对象

   6.7 定义类或对象容易犯的错误

   6.8 共有与私有

   6.9 成员函数的声明和定义

   6.10 内联函数

   6.11 头文件与源文件

   6.12 const成员函数

   6.13 构造函数

   6.14 默认构造函数

   6.15 析构函数

   6.16 析构对象数组

   与LSGO一起学“C++上机小练习06”

   与LSGO一起学“C++上机小练习07”

   与LSGO一起学“C++上机小练习08”

第7章 循环语句

   7.1 循环语句的老祖宗——goto语句

   7.2 while语句

   7.3 while语句的其他用法

   7.4 continue和break语句

   7.5 永不休止的while循环

   7.6 do……while循环

   7.7 for循环

   7.8 灵活的for循环

   7.9 条件为空的for循环

   7.10 嵌套的for循环

   7.11 switch语句

   7.12 switch语句常见错误

   7.13 switch的菜单功能

   与LSGO一起学“C++上机小练习09”

   与LSGO一起学“C++上机小练习10”

第8章 指针

   8.1 什么是地址

   8.2 用指针来保存地址

   8.3 空指针

   8.4 指针与变量类型

   8.5 用指针来访问值

   8.6 容易混淆的概念

   8.7 指针对数值的操作

   8.8 更换指针保存的地址

   8.9 为什么使用指针

   8.10 内存泄漏

   8.11 在堆中创建对象

   8.12 在堆中删除对象

   8.13 访问堆中的数据成员

   8.14 在构造函数中开辟内存空间

   8.15 对象在栈和堆中的不同

   8.16 this指针

   8.17 指针的常见错误

   8.18 指针的运算

   8.19 常量指针

   8.20 对指针的认知

   与LSGO一起学“C++上机小练习11”

第9章 引用

   9.1 什么是引用

   9.2 引用的地址

   9.3 引用就是别名常量

   9.4 引用对象

   9.5 空引用

   9.6 按值传递

   9.7 按指针(地址)传递

   9.8 按别名传递

   9.9 让函数返回多个值

   9.10 用值来传递对象

   9.11 用指针来传递对象

   9.12 用const指针来传递对象

   9.13 用引用来传递对象

   9.14 到底是使用引用还是使用指针

   9.15 引用和指针可以一块用

   9.16 引用容易犯的错误

   9.17 引用一个按值返回的堆对象

   9.18 引用一个按别名返回的堆对象

   9.19 在哪里创建就在哪里释放

第10章 深入函数

第11章 运算符重载

第12章 继承

第13章 虚函数

第14章 数组

   14.1 什么是数组

   14.2 数组元素

   14.3 数组下标越界

   14.4 倒序输出

   14.5 将数组的下标定义为常量以便于修改

   14.6 手动操作数组元素

   14.7 数组的初始化

   14.8 求平均考试成绩

   14.9 兔子繁殖问题

   14.10 数字排序问题

   14.11 数组在内存中的分布

   14.12 数组名

   14.13 数组名与函数

   14.14 传递与接收

   14.15 将数组传递给函数

   14.16 求数组所有元素的和

   14.17 用递增法查找数据

   14.18 用二分法查找数据

   14.19 判断数组是否按照顺序排列

   14.20 判断数组排列方式然后执行不同的函数

   14.21 数组在对象中的传参

   14.22 对象数组

   14.23 在对象数组中初始化成员变量

   14.24 复习:堆对象

   14.25 指针数组

   14.26 堆中对象数组

   14.27 枚举常量与数组

   14.28 多维数组

   14.29 多维数组初始化

   14.30 定义字符数组

   14.31 二维数组输出图形

   14.32 字符串数组

   14.33 字符串的输入问题

   14.34 strcat函数

   14.35 strcpy函数

   14.36 strcmp函数

   14.37 strupr函数

   14.38 strlwr函数

   14.39 strlen函数

   14.40 打印杨辉三角形

第15章 链表

第16章 多态

第17章 类的特殊成员

第18章 字符串

第19章 代码重用

第20章 友元类与嵌套类

第21章 流

第22章 命名空间

第23章 模板

第24章 异常和错误处理

第25章 补充内容

   25.6 位运算

C++学习补充资料

   C++中inline函数

   C++中类的inline成员函数

   C++中混合运算的类型转换

   C++上机小练习01参考代码

   C++上机小练习02参考代码

   C++上机小练习03参考代码

   C++上机小练习04参考代码

   C++上机小练习05参考代码

   C++上机小练习06参考代码

   C++上机小练习07参考代码

   C++上机小练习08参考代码

   C++上机小练习09参考代码

   C++上机小练习10参考代码

   C++上机小练习11参考代码


华北电力大学LSGO软件技术团队成立于2010年09月25日,团队主要以机器学习地理信息系统为主要研究方向,成立几年来为学校培养了大量优秀人才,他们或者就职于IBM、阿里巴巴、网易游戏、百度等IT企业,或者就读于中科院信安所、中科院计算所、中科院自动化所、中国科技大学、北京理工大学、武汉大学、华南理工大学、哈尔滨工业大学、华北电力大学等著名高校。

今年(2016年07月)毕业的李文乔同学保送到北京理工大学,安晟同学继续在华北电力大学读研究生,期间华硕公司,小米公司也希望团队推荐学生就业,综上,来LSGO软件技术团队学习可作为驻保高校学生,打发课余时间的一个不错选择。

如果对我们感兴趣,可以与我联系,通过考核后即可成为我们的一员。

请阅读以下代码(C#),得到联系方式:

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多