More Effective C++ 读书摘要(五、技巧1)Item25 - 27

多边形裁剪算法 多边形裁剪算法 刚参加工作就跟多边形刚上了,对于多边形的裁剪做一些简单的总结。 多边形裁剪主要有四种算法 Greiner-Hormann裁剪算法 Sutherland-Hodgman算法 Vatti裁剪算法 Weiler-Atherton裁剪算法 作为一名想要成为优秀算法工程师的程序员,我们不能只会使用,而不知道其原理,倘若如此,我们无法做到应用于本身业务上的定制化的修改。 Greiner–H... 阅读详情

 Item25. 使构造函数和非成员函数具有虚函数的行为:


有三个类,注意其继承关系:

其构造函数如下:

readComponent所做的工作是:它根据所读取的数据建立了一个新对象,或是TextBlock或是Graphic。因为它能建立新对象,它的行为与构造函数相似,而且因为它能建立不同类型的对象,我们称它为虚拟构造函数。虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象。

 

还有一种特殊种类的虚拟构造函数――虚拟拷贝构造函数,也有着广泛的用途。虚拟拷贝构造函数能返回一个指针,指向调用该函数的对象的新拷贝:

 

类的虚拟拷贝构造函数只是调用它们真正的拷贝构造函数。因此”拷贝”的含义与真正的拷贝构造函数相同(浅拷贝或深拷贝、是否引用计数)。注意上述代码的实现利用了最近才被采纳的较宽松的虚拟函数返回值类型规则。被派生类重定义的虚拟函数不用必须与基类的虚拟函数具有一样的返回类型。

 

NLComponent有了虚拷贝构造函数以后,要为NewLetter实现一个的(常规的)拷贝构造函数变得很容易:

 

让非成员函数具有虚函数的行为

具有虚拟行为的非成员函数很简单。你编写一个虚拟函数来完成工作,然后再写一个非虚拟函数,它什么也不做只是调用这个虚拟函数。为了避免这个句法花招引起函数调用开销,你可以内联这个非虚函数。

 

Item26. 限制类对象的个数:


允许一个或零个对象

 

客户端使用printer时有些繁琐:
Printer::thePrinter().reset();
Printer::thePrinter().submitJob(buffer);

 

另一种办法是把thePrinter移出全局域,放入namespace(命名空间)

在thePrinter的实现上有两个微妙的不引人注目的地方,值得我们看一看。

 

第一,单独的Printer是位于函数里的静态成员而不是在类中的静态成员,这样做是非常重要的。在类中的一个静态对象实际上总是被构造(和释放),即使不使用该对象。与此相反,只有第一次执行函数时,才会建立函数中的静态对象,所以如果没有调用函数,就不会建立对象。(不过你得为此付出代价,每次调用函数时都得检查是否需要建立对象。)与一个函数的静态成员相比,把Printer声明为类中的静态成员还有一个缺点,它的初始化时间不确定。

 

第二个细微之处是内联与函数内静态对象的关系。不要建立包含局部静态数据的非成员内联函数。
也可以只需简单地计算对象的数目,一旦需要太多的对象,就抛出异常,这样做也许会更好。如下所示,这样建立printer对象:

以下为实现:

 

不同情形下的对象创建
刚刚的Printer类在以下的情形下会有问题。  

问题是Printer对象能存在于三种不同的环境中:只有它们本身;作为其它派生类的基类;被嵌入在更大的对象里。存在这些不同环境极大地混淆了跟踪“存在对象的数目” 的含义,因为你心目中的“对象的存在” 的含义与编译器不一致。

 

通常你仅会对允许对象本身存在的情况感兴趣,你希望限制这种实例(instantiation)的数量。如果你使用最初的Printer类示例的方法,就很容易进行这种限制,因为Printer构造函数是private,(不存在friend声明)带有private构造函数的类不能作为基类使用,也不能嵌入到其它对象中。

 

你不能从带有private构造函数的类派生出新类,这个事实衍生出了一种阻止派生类的通用方法,这种方法不需要和限制对象实例数量的方法一起使用。

 

现在考虑有一个类FSA,表示一个finite state automata(有限态自动机) 。(这种机器能用于很多环境下,比如用户界面设计),并假设你允许建立任意数量的对象,但是你想禁止从FSA派生出新类。(这样做的一个原因是表明在FSA中存在非虚析构函数。) 

可以把makeFSA返回的指针存储在auto_ptr中(参见条款9);当它们自己退出生存空间时,这种对象能自动地删除它们所指向的对象:
// 间接调用缺省FSA构造函数
auto_ptr<FSA> pfsa1(FSA::makeFSA());

// indirectly call FSA copy constructor
auto_ptr<FSA> pfsa2(FSA::makeFSA(*pfsa1));
...                         // 象通常的指针一样使用pfsa1和pfsa2,
                           //不过不用操心删除它们。 

 

允许对象来去自由

如前的方案使用thePrinter函数封装对单个对象的访问,以便把Printer对象的数量限制为一个,这样做的同时也会让我们在每一次运行程序时只能使用一个Printer对象。即不能编写以下的代码:

(thy:因为thePrinter管理的是一个静态对象。)

 

我们需要做的就是把先前使用的对象计数的代码与makePrinter()伪构造函数代码合并在一起:

 

一个用于对象计数的基类 

 

现在能使用Counted模板修改Printer类:

Printer使用了Counter模板来跟踪存在多少Printer对象,因为除了Printer的编写者,没有人关心这个事实。它的实现细节最好是private,这就是为什么这里使用private继承的原因。

 

Counted所做的大部分工作对于Printer的客户端来说都是隐藏的,但是这些客户端可能很想知道有当前多少Printer对象存在。Counted模板提供了objectCount函数,用来提供这种信息,但是因为我们使用private继承,这个函数在Printer类中成为了private。为了恢复该函数的public访问权,我们使用using声明:  

这里没有检测对象的数量是否已经超过限制,执行完构造函数后也没有增加存在对象的数目。所有这些现在都由Counted<Printer>的构造函数来处理,因为Counted<Printer>是Printer的基类,Counted<Printer>的构造函数总在Printer的前面被调用。如果建立过多的对象,Counted<Printer>的构造函数就会抛出异常,甚至都没有调用Printer的构造函数。

 

最后一个问题是应该初始化Counted<Printer>::maxObjects为多少呢?
简单的方法就是什么也不做。而是让此类的客户端提供合适的初始化。Printer的作者必须把这条语句加入到一个实现文件里:
const size_t Counted<Printer>::maxObjects = 10;
如果这些作者忘了对maxObjects进行初始化,连接时就会发生错误,因为maxObjects没有被定义。如果我们提供了充分的文档对Counted客户端说明了需求,他们会回去加上这个必须的初始化。

 

Item27. 要求或禁止对象分配在堆上:

 

要求在堆中建立对象

一种最直接的方法是让析构函数成为private,让构造函数成为public。通过引入一个专用的伪析构函数,用来访问真正的析构函数。客户端调用伪析构函数释放他们建立的对象。

然后客户端这样进行程序设计:

通过限制访问一个类的析构函数或它的构造函数来阻止建立非堆对象,但是在条款26已经说过,这种方法也禁止了继承和包含(containment)。

 

通过把UPNumber的析构函数声明为protected(同时它的构造函数还保持public)就可以解决继承的问题,需要包含UPNumber对象的类可以修改为包含指向UPNumber的指针:

 

 

判断对象是否在堆中

 如果想利用一个在很多系统上存在的事实,程序的地址空间被做为线性地址管理,程序的栈从地址空间的顶部向下扩展,堆则从底部向上扩展,来判断某个特定的地址是否在堆中:

到目前为止,这种逻辑很正确,但是不够深入。最根本的问题是对象可以被分配在三个地方,而不是两个。是的,栈和堆能够容纳对象,但是我们忘了静态对象。它们的位置是依据系统而定的,但是在很多栈和堆相向扩展的系统里,它们位于堆的底端。onHeap不能工作的原因立刻变得很清楚了,不能辨别堆对象与静态对象的区别。


令人伤心的是不仅没有一种可移植的方法来判断对象是否在堆上,而且连能在多数时间正常工作的“准可移植”的方法也没有。(作者后来确信基于签名的技巧是一种直接明了的方法:http://www.aristeia.com/BookErrata/M27Comments.html)

 

其实研究对象是否在堆中这个问题,一个可能的原因是你想知道对象是否能在其上安全调用delete。幸运的是“判断是否能够删除一个指针”比“判断一个指针指向的事物是否在堆上”要容易一些。

 

我们希望这些函数提供这些功能时能够不污染全局命名空间,没有额外的开销,没有正确性问题。幸运的是C++使用一种抽象混合(mixin)基类满足了我们的需要。


抽象基类是不能被实例化的基类,也就是至少具有一个纯虚函数的基类。mixin(mix in)类提供某一特定的功能,并可以与其继承类提供的其它功能相兼容)。这种类几乎都是抽象类。因此我们能够使用抽象混合(mixin)基类给派生类提供判断指针指向的内存是否由operator new分配的能力。该类如下所示: 

下面是其实现:

代码还是很一目了然。只有一个地方可能让你感到困惑,就是这个语句(在isOnHeap函数中)
const void *rawAddress = dynamic_cast<const void*>(this);
因为带有多继承或虚基类的对象会有几个地址,这导致编写全局函数isSafeToDelete会很复杂。这个问题在isOnHeap中仍然会遇到,但是因为isOnHeap仅仅用于HeapTracked对象中,我们能使用dynamic_cast操作符的一种特殊的特性来消除这个问题。只需简单地放入dynamic_cast,把一个指针dynamic_cast成void*类型(或const void*或volatile void* 。。。。。),生成的指针指向“原指针指向对象内存”的开始处。如果你的编译器支持dynamic_cast 操作符,这个技巧是完全可移植的。

 

使用这个类,即使是最初级的程序员也可以在类中加入跟踪堆中指针的功能。他们所需要做的就是让他们的类从HeapTracked继承下来。例如我们想判断Assert对象指针指向的是否是堆对象:  

我们能够这样查询Assert*指针,如下所示:

 

 

禁止对象分配在堆上

通常对象的建立这样三种情况:对象被直接实例化;对象做为派生类的基类被实例化;对象被嵌入到其它对象内。以下分别说明:

 

①禁止用户直接实例化对象:
可以这样编写:

现在客户端仅仅可以做允许它们做的事情:

UPNumber n1;                                  // okay

static UPNumber n2;                         // also okay

UPNumber *p = new UPNumber;      // error! attempt to call
                                                        // private operator new

如果你也想禁止UPNumber堆对象数组,可以把operator new[]和operator delete[](参见条款8)也声明为private。

 

②把operator new声明为private同样会阻碍UPNumber对象做为一个位于堆中的派生类对象的基类被实例化。因为如果operator new和operator delete没有在派生类中被声明为public,它们就会被继承下来,继承了基类private函数的类,如下所示:

 

③同样,UPNumber的operator new是private这一点,不会对分配包含做为成员的UPNumber对象的对象产生任何影响:
  

费雪的未来增长评估:预测颠覆性技术的影响 本文旨在提供一个系统性的框架,用于评估和预测颠覆性技术的增长轨迹。我们将重点关注费雪增长模型(Fisher-Pry Model)这一经典技术扩散理论,探讨其在现代技术预测中的应用价值。文章首先介绍费雪增长模型的基本概念,然后深入其数学原理和算法实现。随后展示实际应用案例,讨论工具资源,最后探讨未来发展趋势。每个部分都包含详细的技术实现和理论分析。费雪增长模型(Fisher-Pry Model):一种描述技术替代过程的S型增长模型,用于预测新技术取代旧技术的速率。 阅读详情

相关推荐

stm32最小系统_完成一个最小FOC矢量控制系统所需的基本模块和功能配置

当我们读懂 FOC 矢量控制的基本原理之后,便迫不及待的想动手尝试,去实现一个矢量控制系统,让电机先转起来,有一个直观的感受。因此,我们需要设计实现一个矢量控制的最小系统,具备矢量控制的基本功能,满足电机矢量运行的基本条件。首先,看一下矢量控制的基本架构:矢量控制架构如上图所描述,矢量控制系统包括实时电流的采集、clarke 变换、park 变换、SVPWM 、实时角度的反馈和计算以及电流环和速...

weixin_39524048的博客 1784

More Effective C++之 Item M25:将构造函数和非成员函数虚拟化

从字面来看,谈论“虚拟构造函数”没有意义。当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你又确切地知道想要的对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢? 很简单。尽管虚拟构造函数看起来好像没有意义,其实它们有非常大的用处(如果你认为没有意义的想法就没有...

janeqi1987的专栏 209

别再被坑了!手把手教你从官网下载免费正版Notepad++(附最新网盘链接)

本文详细指导如何从Notepad++官网安全下载正版软件,避免山寨版本带来的安全风险。通过识别官网特征、推荐官方下载渠道、揭露山寨网站骗局及验证正版功能,帮助用户高效获取纯净的Notepad++代码编辑器,并分享实用插件和配置优化技巧。

weixin_42527654的博客 566

More Effective C++之25

条款25:将constructor和non-member functions虚化       虚拟构造函数:这个名词有点恐怖,C++的构造函数是不允许虚拟的,那么这个虚拟构造函数又拥有什么样的含义呢?       考虑如下代码:class Base //基类{};class DeriveA : public Base{};class DeriveB : publ

李永亮的专栏 914

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

Python中优化模块scipy.optimize的优化算法介绍

如果你有一个特殊的优化问题,你可以使用对象来自定义问题的求解。# 自定义目标函数# 自定义优化问题custom_problem.fun = custom_objective_function # 目标函数custom_problem.x = [1, 1] # 初始猜测# 执行优化# 打印结果在上述例子中,我们自定义了一个对象,并指定了目标函数和初始猜测,然后使用minimize函数进行求解。Scipy的优化模块提供了丰富的功能,适用于各种优化问题。

Pandas120的博客 3049

More effective C++ 条款25 将构造函数和非成员函数虚拟化

7.1 Item M25:将构造函数和非成员函数虚拟化 从字面来看,谈论“虚拟构造函数”没有意义。当你有一个指针或引用,但是不知道其指向对象的真实类型是什么时,你可以调用虚拟函数来完成特定类型(type-specific)对象的行为。仅当你还没拥有一个对象但是你又确切地知道想要的对象的类型时,你才会调用构造函数。那么虚拟构造函数又从何谈起呢? 很简单。尽管虚拟构造函数看起来好像没有意义,其实它

qq_31984717的博客 338

Python 爬虫实战:共享单车数据采集全流程与市场洞察深度剖析

本文介绍了如何利用Python爬虫技术获取和分析共享单车运营数据。文章从项目背景出发,详细阐述了系统架构设计,包括数据抓取、清洗存储、分析和可视化模块。通过Scrapy、BeautifulSoup等工具实现数据采集,使用Pandas进行数据清洗,并借助Matplotlib进行可视化分析。实战部分展示了爬虫代码示例和城市分布、使用频率等分析案例。最终指出数据驱动分析有助于了解行业现状和市场趋势,未来可结合机器学习等方法进行深入洞察。该技术方案为共享单车行业研究提供了有效的数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2233

c++将构造与非成员函数虚化的方法

虚函数拥有因类型而异的行为。而构造函数则是已经明确了对象,才调用的,所以,构造函数不能为虚函数,但是,我们可以通过一些方法使得构造函数可以有虚函数的功能。 所谓的虚构造函数,是一种函数,视其获得的输入,可产生不同类型的对象。用途:如在从磁盘(或网络或磁带等)读取信息时。 class A{                //抽象基类,内含虚函数 public: .. }; class B

qq_37185716的博客 445

RH850从0搭建Autosar开发环境【6】- Davinci Configurator之CanIf模块配置详解(下)

RH850从0搭建Autosar开发环境【6】- Davinci Configurator之CanIf模块配置详解(下)

weixin_42412049的博客 2585

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5569

17 More Effective C++—条款25(构造函数与非成员函数的虚化)

1 构造函数的虚化 1 构造虚函数 构造函数与类的名称相同,因此,此处所指的虚化,并非让构造函数变成虚函数,而是让其具有类似虚函数的行为: 当条件不同时,不同的对象会被创建出来。 下面的代码展示了“虚构造函数”的应用。 class Base { } class Derive1 : public Base { } class Derive2: public Base { } Base* con...

26栀子枫香 378

HTML粉色爱心(完整代码)

HTML语言实现粉色爱心的完整代码。

AIGC 1118

More Effective C++ 读书摘要(五、技巧3)Item30 - 31

Item30. 代理类: 实现二维数组 对于C++内置的数组,如data[][],第一个[]返回的是一个数组,第二个[]从这个返回的数组中再去取一个元素。我们可以通过重载Array2D类的operator[]来玩同样的把戏。Array2D的operator[]返回一个新类Array1D(代表一维数组)的对象,再重载Array1D的operator[]来返回所需要的二维数组中的元

thy专栏 1034

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

More Effective C++:Item 1-Item 8读书笔记

Item M1:指针与引用的区别 在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向 Item M2:尽量使用C++风格的类型转换 static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样; const_cast用于类型转换掉表达式的const...

部落阁 407

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

More Effective C++ 读书摘要(一、基础议题 二、运算符)Item1 - 8

〇、“引言”约定与术语:1.指针加p,引用加r。2.(在对operator==)的调用中,lhs和rhs,分别为“left-hand side”、“right-hand side”的缩写。3.ctor表示“constructor”,dtor表示“destructor” 一、基础议题Item 1. 区分指针和引用:以下情况应该使用引用->①当知道要指代某个对象并且不会再指代其他的东西②当实现

thy专栏 820

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)

正文 最近北京房价蹭蹭猛涨,买了房子的人心花怒放,没买的人心惊肉跳,咬牙切齿,楼主作为北漂无房一族,着实又亚历山大了一把,这些天晚上睡觉总是很难入睡,即使入睡,也是浮梦连篇,即使亚历山大,对C++的热情和追求还是不减,应该是感动了周公吧,梦境从此处开始,大师入场来给我安慰了。。。 11点躺在床上了,脑子里总结一下最近的工作:最近的开发用到inline函数比较多,众所周知,inline的

tmchongye的专栏 2166

More Effective C++ 读书摘要(四、效率)Item16 - 24

Item16. 记住80-20准则:80-20准则说的是大约20%的代码使用了80%的程序资源;大约20%的代码耗用了大约80%的运行时间;大约20%的代码使用了80%的内存;大约20%的代码执行80%的磁盘访问;80%的维护投入于大约20%的代码上;通过无数台机器、操作系统和应用程序上的实验这条准则已经被再三地验证过。80-20准则不只是一条好记的惯用语,它更是一条有关系统性能的指导方针,它

thy专栏 810

读书笔记 effective c++ Item 8 不要让异常(exceptions)离开析构函数

1.为什么c++不喜欢析构函数抛出异常 C++并没有禁止析构函数出现异常,但是它肯定不鼓励这么做。这是有原因的,考虑下面的代码: 1 class Widget { 2 3 public: 4 5 ... 6 7 ~Widget() { ... } // assume this might emit an exception 8 9 }; 10

wwqwkg6e的专栏 251

Effective C++ 读书笔记 Item33 避免隐藏继承来的名称(继承与作用域嵌套)

其实本文的话题和继承完全没有关系,隐藏名称是作用域的问题。 在C++中每一对{}都会开启一个新的作用域,并嵌套在当前作用域中。 一个示例 int x; void func(){ double x; cin>>x; // read a new value for local x } 可以看到double x隐藏了int x,因为C++的名称隐藏规则(n...

Vermont_的博客 207

More Effective C++读书笔记---异常

异常如果你需要一个方法,能够通知不可被忽略的异常状态,并且搜索栈空间以便找到异常处理代码时,你还得确保局部对象的析构函数必须被调用,这时你就需要使用C++的异常处理九、条款9--使用析构函数防止资源泄漏1.ALA* pa = readALA( dataResource );pa->processAdoption();delete pa;如果processAdoption()抛出异常,process

DotScylla 864

读书笔记 effective c++ Item 37 永远不要重新定义继承而来的函数默认参数值

  从一开始就让我们简化这次的讨论。你有两类你能够继承的函数:虚函数和非虚函数。然而,重新定义一个非虚函数总是错误的(Item 36),所以我们可以安全的把这个条款的讨论限定在继承带默认参数值的虚函数上。 1. 虚函数是动态绑定的,而默认参数是静态绑定的 在这种情况下,这个条款的验证就相当直接了:虚函数是动态绑定的,而默认参数值是静态绑定的。 这是什么?你说你不堪重负的脑袋已经忘记了动态绑...

HarlanC的专栏 225

读书笔记MoreEffectiveC++(22)

考虑用运算符的赋值形式(op=)取代其单独形式(op) 1.就C++来说,operator+、operator=和operator+=之间没有任何关系,因此如果你想让这三个operator同时存在并具有你所期望的关系,就必须自己实现它们。 2.、总的来说operator 的赋值形式比其单独形式效率更高,因为单独形式要返回一个新对象,从而在临时对象的构造和释放上有一些开销。operator 的赋

393

读书笔记MoreEffectiveC++(33)

将非尾端类设计为抽象类 1.绝大部分纯虚函数都没有实现,但纯虚析构函数是个特例。它们必须被实现,因为它们在派生类析构函数被调用时也将被调用。而且,它们经常执行有用的任务,诸如释放资源(见Item M9)或纪录消息。实现纯虚函数一般不常见,但对纯虚析构函数,它不只是常见,它是必须。

470

More Effective C++ 笔记

More Effective C++ 学习笔记,比起Effective,More Effective有更多的奇妙技巧,更深层次的探讨,看起来更加时髦...

苹果君的工作室 787

将构造函数以及非成员函数 “虚化”

虚构造函数,这似乎是非常违反直观 的一件事情,由于当你拥有一个对象的指针或者引用的时候,你能够通过该对象的动态类型来调用虚函数,而在此处,你的对象还没有构造完毕。 事实上,“虚构造函数”并非把你的构造函数声明为virtual,而是某一种函数,依据其输入数据,来决定此时构造什么类型的对象。比方你要从文件或者网络上读取一些数据,从该数据你来决定你要创建什么类型的对象。 比方: 下...

weixin_34186128的博客 149
上一篇: More Effective C++ 读书摘要(四、效率)Item16 - 24
下一篇: 《Beginning Python From Novice to Professional》学习笔记四:Tuple
thy38
博客等级 码龄19年 184粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值