模板--进阶
1. 非类型模板参数
模板解决了两类问题
1控制数据类型
2控制某种设计逻辑
类域可以直接访问什么?
1static修饰的静态成员变量
2typedef定义的内嵌类型
3 内部类
下面我们就要引出一个模板的知识点----------再用类模板的时候从类模板里面去取东西的时候
要在模板参数Container前面加上typename!
原因是:编译不确定Container::const_iterator是类型还是对象
typename就是明确告诉编译器这里是类型,等模板实例化再去找,或者用auto代替(auto已经表明是类型了)
有一个原则:没有实例化的模板不能用域作用限定符去取东西
因为这时候编译器不知道你取出的东西是什么可以是typedef定义的内嵌类型或者内部类,但是如果是取的是静态成员变量和对象的话就就会报错(静态成员变量不支持后面的操作,对象也是不合法的)
所以以后要去取东西的时候就要加typename
模板参数分类 :类型形参与非类型形参。
class 和typename是有区别的(一般用的时候是一样的)
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
//这两个就是类型参数和非类型参数
template <class T,size_t N>
class array
{
public:T& operaotr[](size_t n){return _a[n];}
private:T _a[N];size_t size;
};
这个参数是常量而且必须是整形,因为非类型模板参数一般用来使用来定义静态数组
非类型就是变量,按需实例化(调用了才会去实例化)
array这个容器就用到了非类型模板参数
这是c++11出来的比较鸡肋的东西
array其实就是一个数组,我们自己搞得数组和array他俩都能支持同样的操作,同样不初始化
array唯一的有事就是对越界的检查就比较严格,越界读写都能检查,普通数组就不能检查
那么问题来了,用vector 不香吗
注意:
1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2. 非类型的模板参数必须在编译期就能确认结果。
2. 模板的特化
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结 果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板
2.1函数模板的特化
// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}// 对Less函数模板进行特化
template<>
bool Less<Date*>(Date* left, Date* right)
{return *left < *right;
}int main()
{cout << Less(1, 2) << endl;Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less(d1, d2) << endl;Date* p1 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl; // 调用特化之后的版本,而不走模板生成了return 0;
}
1. 必须要先有一个基础的函数模板
2. 关键字template后面接一对空的尖括号<>
3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型
4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。
函数模板的特化 ,可以去写特化来解决问题或者再写一个构成函数重载
bool Less(Date* left, Date* right)
{return *left < *right;
}
该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化时特别给 出,因此函数模板不建议特化
2.2类模板的特化
但是类模板不同,必须要去走特化
类模板的特化其实就是对原来的类进行特殊处理
根据你传的东西编译器去判断是走正常的还是特殊处理过的,就像传指针日期类的比较
正常是要传这两个vector<Date*> PLess<Date>的,但是很麻烦,我们可以通过特化,检测到是Date*就走特化的处理
2.3特化的分类
1全特化
就是将模板参数列表里面所有的参数都确定化
2偏特化
偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。
偏特化有以下两种表现方式:
1部分特化 将模板参数类表中的一部分参数特化。
2参数更进一步的限制 偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版 本。(就像将两个参数都限定为指针或者引用)
template <class T1,class T2>
class Date
{
public:Date(){cout << "Date<T1,T2>" << endl;}
};
//全特化
template <>
class Date<int ,char>
{
public:Date(){cout << "Date<int ,char>" << endl;}
};template <class T1,class T2>
class Date<T1*, T2*>
{
public:Date(){cout << "Date<T1*, T2*>" << endl;}
};
template <class T1, class T2>
class Date<T1&, T2&>
{
public:Date(){cout << "Date<T1&, T2&>" << endl;}
};
//偏特化
template <class T1>
class Date<T1, char>
{
public:Date(){cout << "Date<T1, char>" << endl;}
};int main()
{Date<int, int> d1;Date<int, char> d2;Date<double, char> d3;Date<int*, int*> d4;Date<int&, int&> d5;return 0;
}
其实特化严格上不是一个新的类,不能独立存在,但是实例化的东西是一个不同的类型,这些类根据你的需求自己再去设计(对特殊情况特殊处理)可能用不到原来的类的所有功能,就可以光实现想用的功能
3. 模板的分离编译
我们之前实现的一系列容器,我们都是把定义写到.h文件中,而我们在c语言实现这些东西的时候
都是声明和定义分离,这是为什么呢?
程序测试代码
Stack.cpp
#include "Stack.h"
namespace cy
{template <class T,class Container>void stack<T, Container>::push(const T& x){_con.push_back(x);}template <class T, class Container>void stack<T,Container>::pop(){_con.pop_back();}void A::func1(int i){}
}
Stack.h
#include <vector>
namespace cy
{//容器适配器template <class T,class Container=std::vector<T>>class stack{public:void push(const T& x);void pop();T& top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};class A{public:void func1(int i);//void func2();};}
Test.cpp
#include <iostream>
#include <array>
#include<vector>
using namespace std;
#include "Stack.h"int main()
{cy::stack<int> s1;s1.push(1);return 0;
}
显而易见,会报错,可是我们写了定义啊
主要的原因就是用了模板,模板没有实例化,尽管有定义,但是不能生成地址
这与我们之前讲的函数名修饰规则一样,你模板都没实例化编译器怎么去修饰,当然就没定义了
没有用模板的话,只有函数有定义,编译阶段才会生成地址,只有声明相当于就是一个承诺,这样编译就不会报错,而到链接的时候就会去找,这是如果没有地址就会报链接错误
解决方法
1. 将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的。推荐使用这种。
2. 模板定义的位置显式实例化。这种方法不实用,不推荐使用。
#include "Stack.h"
namespace cy
{template <class T,class Container>void stack<T, Container>::push(const T& x){_con.push_back(x);}template <class T, class Container>void stack<T,Container>::pop(){_con.pop_back();}void A::func1(int i){}
//就是这样显示实例化templatestack<int>;
}
这样显示实例化很不方便,用一个类型就要显示实例化一个类型
4. 模板总结
【优点】
1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
2. 增强了代码的灵活性
【缺陷】
1. 模板会导致代码膨胀问题,也会导致编译时间变长
2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误
相关文章:
模板--进阶
1. 非类型模板参数 模板解决了两类问题 1控制数据类型 2控制某种设计逻辑 类域可以直接访问什么? 1static修饰的静态成员变量 2typedef定义的内嵌类型 3 内部类 下面我们就要引出一个模板的知识点----------再用类模板的时候从类模板里面去取东西的时候 要…...
PostgreSQL无法查看表中数据问题排查
在 PostgreSQL 中,恢复数据库后,使用 DBeaver 等工具可以看到数据库和表名,但无法查询到表中数据,可能是以下原因之一。以下是可能的原因和解决方法: 1. 恢复未完全成功 原因:数据库恢复过程中可能未完全成…...
实验研究 | 千眼狼高速摄像机驱动精密制造创新
研究背景 小模数齿轮作为精密制造领域的核心组件,以“结构紧凑、重量轻、精度高”等优势,广泛应用于航空航天、工业机器人、精密仪器、医疗设备、新能源和微电机等领域。传统抛光技术效率低、成本高、表面质量不足,电解等离子体抛光技术&am…...
AWS虚拟专用网络全解析:从基础到高级实践
导语 AWS虚拟专用网络是连接企业本地数据中心与AWS云环境的关键桥梁。本文将深入探讨AWS VPN的核心概念、配置方法、最佳实践以及常见问题解决方案,助您构建安全、可靠的混合云网络架构。 一、AWS VPN概述 1. 定义 AWS VPN是一种网络服务,允许用户通过加密隧道将本地网络…...
工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能
工业园区工厂企业数字IP广播应急呼叫对讲系统:数字IP广播极大提升工厂企业管理效率与应急响应效能 北京海特伟业科技有限公司任洪卓发布于2025年4月28日 在数字化转型浪潮下,IP应急广播呼叫对讲广播系统凭借其网络化、智能化、融合化、多元化等优势,已…...
我的HTTP和HTTPS
注释:本文章架构跟随小林coding,在此基础上加深个人理解 小林coding:https://xiaolincoding.com/network/2_http/http_interview.html HTTP基本概念 HTTP是什么? http的中文名是超文本传输协议,超文本就是html&…...
python_股票月数据趋势判断
目录 前置 代码 视频&月数据 前置 1 A股月数据趋势大致判断,做一个粗略的筛选 2 逻辑: 1)取最近一次历史最高点 2)以1)中最高点为分界点,只看右侧数据,取最近一次最低点 3…...
计算机考研精炼 计网
第 19 章 计算机网络体系结构 19.1 基本概念 19.1.1 计算机网络概述 1.计算机网络的定义、组成与功能 计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 …...
大数据应用开发和项目实战-Matplotlib
Matplotlib的介绍 Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。 Matplotlib 可以用来绘制各种静态,动态,交互式的图表。比如说散点图、柱状图等等。 Matplotlib的安装与…...
SQLMesh CLI 实战教程: 构建和维护数据转换管道的快速指南
在数据工程领域,构建和维护数据转换管道是一项复杂而关键的任务。SQLMesh 是一个强大的工具,可以帮助你简化这一过程。本文将带你快速了解如何使用 SQLMesh CLI 来构建和维护数据转换管道。本文的目标是在 30 分钟或更短的时间内,让你熟悉 SQ…...
行政区划代码
本文数据来源:中华人民共和国民政部 在平常数据研究和开发中,经常会用到行政区划代码。而行政区划代码的使用,因年份不同可能也不尽完全相同。故整理了1980年到2024年所有的行政区划代码。 这样不仅仅适用于研究区划代码的变更研究…...
Spring生命周期
在Spring框架中,Bean的生命周期指的是从Bean的创建到销毁的整个过程。这个过程包括了多个阶段,每个阶段都有特定的操作。下面是一个典型的Spring Bean生命周期的概述: 一. 实例化(Instantiation) 当Spring容器启动时&…...
前端连接websocket服务报错 Unexpected response code: 301
前端连接websocket服务报错 Unexpected response code: 301 引直连测试301重定向修改nginx配置 引 websocket后端服务正常,监听正常,可以通过简单的前端代码进行连接,但是通过nginx反向代理后报错Error during WebSocket handshake: Unexpec…...
C语言(5)—操作符详解
文章目录 一、操作符分类概览二、二进制与进制转换2.1 进制基本概念 三、原码、反码与补码3.1 基本概念 四、位操作符详解 一、操作符分类概览 C语言中的操作符可以分为以下几大类: 算术操作符:, -, *, /, % 移位操作符:<<, >>…...
ubuntu新增磁盘挂载
1. 确认新磁盘 使用 lsblk 命令查看系统中所有的块设备,找出新增的磁盘。 rootzzwl:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 60G 0 disk ├─sda1 8:1 0 …...
【计网】计算机网络的类别与性能
一、计算机网络的分类 计算机网络可以根据不同的标准进行分类。下面是两种常见的分类方法: 1.按照网络的作用范围进行分类 广域网 (WAN): 广域网覆盖的范围非常广泛,通常跨越城市、国家或甚至是全球。WAN主要用于连接地理位置相隔较远的计算机和网络设…...
Field访问对象int字段,对象访问int字段,通过openjdk17 C++源码看对象字段访问原理
在Java反射机制中,访问对象的int类型字段值(如field.getInt(object))的底层实现涉及JVM对内存偏移量的计算与直接内存访问。本文通过分析OpenJDK 17源码,揭示这一过程的核心实现逻辑。 一、字段偏移量计算 1. Java层初始化偏移量…...
香橙派打包qt文件报错“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案
PyQt 报错总结:打包文件过程,“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案全解析 在使用 PyQt5 搭建图形界面时,打包文件的过程中出现的问题,真难绷,搞了半天。 Qt 平台插件 xcb 无法加载QOb…...
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理 目录 Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理 一、简单介绍 二、在同一个布局中同时显示 Androi…...
在android 系统上qnn sdk转换,运行模型示例
前面讲了如何配置qnn sdk的环境,这一篇总结下qnn 实际转换一个onnx 模型,并运行的实现步骤。 设备: 1. ubuntu22.04 的Linux 服务器。 2. 一台android手机。 一、下载模型 from optimum.onnxruntime import ORTModelForSequenceClassifi…...
docker安装Canal1.1.5,MySQL5.7踩坑
docker安装Canal 前情提示安装MySQLdocker安装MySQL1. 拉取镜像2. 创建容器映射宿主机目录3. docker run 配置mysql重启mysql新建canal用户 安装Canal创建docker网络安装Canal1.拉取canal镜像2.创建目录3.运行容器 踩坑问题1 前情提示 关于版本问题,官方也没有详细…...
SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换
介绍 Spring Boot通过MessageSource接口来实现国际化,它可以加载不同的消息资源文件,通常是.properties格式。通过定义不同的语言文件(例如:messages_en.properties、messages_zh.properties等),可以根据用…...
C++ 嵌套类 (详解 一站式讲解)
目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式(了解) 嵌套类 嵌套类的定义 首先介绍两个概念: 类作用域(Class Scope) 类作用域是指在类定义内部的范围。在这个作用域内定义的成员(包括…...
EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用
一、方案背景 在300路大型生产监控项目中,由于生产环境复杂多样,涵盖室外厂区、大型车间、室内办公区域等不同场景,单一类型的摄像机难以满足全方位、精细化的监控需求。EasyCVR作为一款功能强大的视频融合管理平台,具备灵活的视…...
解决leensa无法使用的办法:平替教程
Leensa已经完全连不上,并显示超时,至于之前有传言称他们会恢复服务也完全是无稽之谈。 那么,Leensa停止服务后,广大的外贸人,设计人,留学生以及技术人学习,查资料以及开发客户该怎么办呢&#…...
算法思想之哈希表
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之哈希表 发布时间:2025.4.28 隶属专栏:算法 目录 算法介绍哈希表作用什么时候使用哈希表怎么使用哈希表 例题两数之和题目链接题目描述算法思路代码实现 判定是否互为字符重排题目链…...
springboot 视频分段加载在线播放
页面访问视频资源 前端播放加载部分视频,每次选中一个时间点后 往后加载一部分视频,主要用以节省网络传输的数据量 通过ResourceHttpRequestHandler类实现,ResourceHttpRequestHandler支持分片加载,前端请求头中携带Range: bytes 0-10001,就…...
【题解-Acwing】868. 筛质数
题目:868. 筛质数 题目描述 给定一个正整数 n,请你求出 1∼n 中质数的个数。 输入 共一行,包含整数 n。 输出 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 1 ≤ n ≤ 106 时空限制 0.2s / 64MB 输入样例 8输出样例 4代码 #include...
java 和 C#操作数据库对比
Java和C#在操作数据库方面有诸多相似之处,但也存在一些差异,以下从几个方面为你进行对比: 数据库连接 Java 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。连接数据库的步骤通常包括加载…...
用 Python打造交互式图片-音视频管理器:代码分析与实践
在 Python 的 GUI 开发领域,wxPython 是一个功能强大且跨平台的框架,适合快速构建桌面应用程序。本文将深入分析一个基于 wxPython 的交互式图片管理器项目(SelectModelToPlayVideoAndAudio.py),该程序允许用户管理图片…...
Django 缓存框架
动态网站的一个基本权衡是它们是动态的。每当用户请求页面时,Web 服务器进行各种计算,从数据库查询到模板渲染到业务逻辑,以创建您网站访问者看到的页面。从处理开销的角度来看,这比标准的从文件系统中读取文件的服务器安排要昂贵…...
后缀数组~
子串:在字符串s中,取任意i<j,那么在s中截取从i到j的这一段就叫做s的一个子串。 后缀:后缀就是从字符串的某个位置i到字符串末尾的子串,我们定义以s的第i个字符为第一个元素的后缀为suff(i)。 suff(1)就是从第一个字符到最后一个…...
Rust 学习笔记:编程练习(一)
Rust 学习笔记:编程练习(一) Rust 学习笔记:编程练习(一)Convert temperatures between Fahrenheit and CelsiusGenerate the nth Fibonacci numberPrint the lyrics to the Christmas carol “The Twelve …...
【基础知识】常见的计算公式(一)
目录标题 定时器相关公式1. 定时器分频系数计算2. 定时器定时时间计算 波特率相关公式1. 异步串行通信波特率计算 PWM 相关公式1. PWM 占空比计算 不知道你们是不是和我一样,对定时器中的分频系数相关的计算公式,波特率计算公式等,都有点心生畏惧,其核心原因是不清楚不了解,没有…...
【AI生产力工具】Windsurf,一款AI编程工具
Windsurf 是 Codeium 公司推出的一款 AI 编程助手,它是一款集成深度上下文感知、多模型协作和实时代码管理的综合开发环境(IDE)。 Windsurf 作为 AI 编程工具的核心价值在于 “上下文感知 + 多模型协作 + 自动化工作流”,其深度集成的智能体系统(如 Flows 和 Cascade)正…...
【网络原理】TCP提升效率机制(三):延时应答和捎带应答
目录 一. 延时应答 二. 捎带应答 一. 延时应答 延时应答也是基于滑动窗口的一种提升传输效率的方式(减少ACK数量) 接收方收到数据之后,不会立刻返回一个ACK确认报文,而是等一会再返回ACK报文 这样做的好处? 1&…...
Golang|分布式索引架构
当文档数量巨大时,如一亿个文档,倒排索引难以全部放入单机内存。正排索引将热数据和冷数据分别存储在内存和磁盘中。分布式搜索引擎将数据分布在不同服务器上以应对大量数据。 倒排索引的水平切分 水平切分按关键词划分数据,如JAVA和算法在A服…...
【蓝桥杯省赛真题58】Scratch画台扇 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
目录 scratch画台扇 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C资料 scratch画台扇 第十五届青少年蓝桥杯scratch编程省赛真题解析 一…...
WebRTC SDK是什么?
语音环境每年都在变,OKCC以前代理商的客群都是简单高效外呼为主,今年发现变化很大。很多代理商做的终端客户都是给其他业务系统赋能为主了。主流的还是以API对接为主,但是对接中发现webrtc SDK使用频率很高。 那么什么是WebRTC SDK…...
反向代理、负载均衡与镜像流量:原理剖析、区别对比及 Nginx 配置实践
在现代网络架构中,反向代理、负载均衡和镜像流量是保障系统高效、稳定、安全运行的关键技术。虽然它们都涉及网络流量的管理与分发,但在功能、应用场景和实现方式上有着显著差异。本文将深入探讨三者的区别,并结合 Nginx 这一强大的开源服务器…...
PyCharm 2023升级2024 版本
windows下把老版本卸载之后,需要把环境变量,注册表信息删除。 并且把C:\Users\用户\AppData 文件夹下的 Local\JetBrains和Roaming\JetBrains 都删除,再重新安装 原旧项目升级的方式: 1.2023虚拟机的文件夹是venv 改为.venv…...
for(auto it: vec)和for(auto it: vec)的区别以及使用场景
目录 1.for(auto it: vec) 2.for(auto& it: vec) 3.总结 在 C 里,for(auto it: vec) 和 for(auto& it: vec) 都属于基于范围的 for 循环,可用于遍历容器(像 std::vector、std::list 等)或者数组。不过,它们…...
系统思考提升培训效能
彼得德鲁克曾说:管理者的价值,不在于处理了多少事务,而在于创造了多少不可替代的成果。效率是以正确的方法做事,效能则是做正确的事。在系统思考中我们看到:效率往往是对单点问题的反应,而效能则是对整体系…...
第1篇:Egg.js框架入门与项目初始化
一、Egg.js框架优势与设计理念 1. 为什么选择Egg.js? 作为基于Koa 2.x的渐进式企业级框架,Egg.js在阿里系大规模生产环境中验证成熟,具备以下核心优势: 约定优于配置 通过app/config目录结构自动加载机制,减少冗余配置…...
CMU-15445(1)——环境搭建
前言 最近在找完暑期实习之后,终于有了一些干项目外的空余时间学习新的知识,在这么多轮面试中,数据库的考察非常多,但孱弱的数据库基础导致我有很多次面试被问住,因此我希望在学习CMU-15445(Fall 2024&…...
Web基础与HTTP协议
目录 一:Web基础 1.域名和dns 1.1域名的概念 (1)域名的结构 (2)域名结构类型 2.Hosts文件 (1)hosts文件的作用 (2)修改hosts文件 3.DNS 4.域名注册 ࿰…...
数量关系7_行程问题
目录 一、基础行程1. 基础行程2. 比例法运用3. 相遇追及二、特殊情境1. 多次相遇问题(简单)2. 流水问题3. 火车过桥4. 等距离平均速度问题(简单)5. 匀加速一、基础行程 1. 基础行程 公式1:S = Vt 公式2:平均速度=(2 V1V2) / (V1+V2) 例题3(2023 广东) 某地举办了“铁…...
MTK Android12-13 App卸载加锁
实现:App 卸载时候需要加一层拦截锁,客户输入密码后才能正常卸载 文章目录 参考资料:实现方案涉及到修改文件修改方案实现效果 源码分析- 卸载方式一) 设置界面进行卸载InstalledAppDetailsAppInfoDashboardFragmentAppButtonsPre…...
文号验证-同时对两个输入框验证
文号验证-同时对两个输入框验证 效果: 一、如果有多个文号: <div v-for"(item, index) in approvalForm.productApprovalTypeEvents" :key"index"> <el-form-itemlabel"文号":prop"productApprovalTypeEv…...
嵌入式面试八股文(十二)·FreeRTOS中·堆和栈
目录 1. 堆和栈 1.1 堆 1.2 栈 1.3 堆和栈的区别 1.3.1 分配方式 1.3.2 分配效率 1.3.3 生长方向 1.3.4 空间管理 1.3.5 存放内容 1. 堆和栈 1.1 堆 堆是一块用于动态分配内存的区域,用于存储程序运行时动态创建的对象。堆的大小可以在程序运行…...