《认清C++语言》---缺省构造函数

C++中构造函数的参数缺省的详解 C++中构造函数的参数缺省的详解 前言: 构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。在构造函数中也可以采用这样的方法来实现初始化。 #include using namespace std; class A { public : A(int aa=0,int bb=00); //在声明构造函数时指定默认参数 int volume( ); int a; int b; }; int main( ) { A obj(4); cout<<obj.a<< <<obj.b; retur 立即下载

构造函数能够初始化对象,而缺省构造函数(指没有参数的构造函数)则可以不利用任何在建立对象时的外部数据就能初始化对象。这带来正反两面的效果:正面效果是:一些行为特性与数字相仿的对象被初始化为空值或不确定值是合理的,还有例如链表、哈希表、图等数据结构也可以被初始化为空容器;反面效果是:对很多对象来说,不利用外部数据进行完全的初始化是不合理的,比如一个输入姓名的通讯录对象是没有意义的。

理想情况下,无需任何数据就可以建立对象的类可以包含缺省构造函数,而需要初始数据来建立对象的类则不能包含缺省构造函数。但实际上必须考虑更多因素。

 

当一个类没有缺省构造函数时,使用上会存在一些限制:

考虑下面的类:

class ASCEMessage{

public:

         ASCEMessage(int id);

         ...

};

由于ASCEMessage没有缺省构造函数,可能遇到以下问题:

1)建立数组时,一般来说,没有一种方法能在建立对象数组时给构造函数传递参数。也就是说此时不能建立ASCEMessage对象数组:

ASCEMessage asceMessages[20]; //栈上建立,错误,没有正确调用,ASCEMessage没有默认构造函数

ASCEMessage *pasceMessages = new ASCEMessage[20];        //堆上建立,错误,同上

对于栈数组,一种解决方法是在数组定义时提供必要的参数:

int id1, id2, ..., id20;      //存储短信id的变量

...

ASCEMessage asceMessages[] = {        //正确,提供了构造函数的参数

         ASCEMessage(id1),

         ASCEMessage(id2),

         ASCEMessage(id3),

         ...,

         ASCEMessage(id20)

};

遗憾的是,这种方法不能用在堆数组的定义上。

 

一种更通用的解决方法是利用指针数组来代替一个对象数组:

typedef ASCEMessage* PAM;       //PAM指针指向一个ASCEMessage对象

PAM messages[20];       //正确,没有调用构造函数

PAM *messages = new PEM[20];        //也正确

//在指针数组里的每一个指针重新赋值,以指向一个不同的ASCEMessage对象

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

{

         messages[i] = new ASCEMessage(idx);

}

当然,该方法存在两个缺点:一是必须删除数组里每个指针所指向的对象;二是增加了内存分配量。

 

2)无法在许多基于模板的容器类里使用,因为实例化一个模板时,模板的类型参数应该提供一个缺省构造函数,这个要求来自模板内部,被建立的模板参数类型数组里。如下面的数组模板类:

template<class T>

class Array

{

public:

         Array(int size);

         ...

private:

         T *data;

};

 

template<class T>

Array<T>::Array(int size)

{

         data = new T[size];       //为每个数组元素依次调用T::T()

         ...

}

 

3)设计虚基类时:一:如果不提供缺省构造函数,则很难使用它。因为几乎所有的派生类在实例化时都必须给虚基类构造函数提供参数。这就要求所有由没有缺省构造函数的虚基类继承下来的派生类都必须知道并理解提供给虚基类构造函数的参数的含义。二:提供缺省构造函数,但优化如下:

class ASCEMessage

{

public:

         ASCEMessage(int ID = UNSPECIFIED);

         ...

private:

         static const int UNSPECIFIED;      //其值代表ID值不确定

};

但这样有引入一个问题,由于不能确定ID是否有意义,在用到ID的成员函数中都必须检测ID的有效性,这大大减低了代码的效率。

用AI免费制作30分钟电影:完整工作流与实操解析 AI视频生成技术正大幅降低影视创作门槛,但真正制作一部完整电影并非一键生成,而是涉及剧本、分镜、画面、配音、剪辑的复杂流水线。理解其基本原理,是将文本转化为连续视觉叙事的关键。对于创作者而言,掌握角色一致性控制、素材批量管理、免费额度合理分配等技术价值,能有效避免生成结果崩坏与资源浪费。该能力可广泛应用于短视频创作、独立电影预演、教学演示等场景。本文以30分钟AI电影制作为例,拆解从工具选择到成片输出的全流程,重点分析免费方案下的时间与积分成本,以及最容易翻车的环节,并给出基于实践验证的排查与优化策略。 阅读详情

相关推荐

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例)

本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。

stem5的博客 466

C++基础:缺省构造函数

缺省构造函数,又称默认构造函数,是C++以及其他的一些面向对象的程序设计语言中,对象的不需要参数即可调用的构造函数。下面将针对缺省构造函数的定义、使用、以及注意问题等方面简要探讨。 1、缺省构造函数是怎样的形式?是如何定义的? 在C++的一个类中,如果构造函数没有参数,或者构造函数的所有参数都有默认值,就可以称其为缺省构造函数。一个类中...

weixin_30735391的博客 4045

深入CRSF协议数据包:手撕STM32代码,教你像调试串口一样分析ELRS遥控数据流

本文深入解析CRSF协议数据包,通过手撕STM32代码,教你如何像调试串口一样分析ELRS遥控数据流。从硬件准备到数据包捕获状态机设计,再到高级数据分析技巧和实战应用,全面覆盖CRSF协议的解析与优化,帮助开发者构建稳定可靠的通信系统。

weixin_29194693的博客 337

关于C++缺省构造函数的讲解——精解

构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行, 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 在这里有几点要注意的问题: 构造函数在实例化对象时自动被调用,且在每个对象的生命期仅被调用一次。 可以被重载。 若程序员没有主动给类定义构造函数,编译器自动给一个缺省的构造函数。 一旦程序员定...

ThinPikachu的博客 1万+

计算机网络自顶向下(第八版)第一章课后习题

电路交换网络具有以下优点:资源独占性,在建立连接时,电路交换网络为通信双方独占一条物理路径,不会受到其他用户的影响。低时延,由于建立了专用路径,数据传输时延较小,适合对时延敏感的应用,如实时语音和视频通信。数据链路层:提供节点之间可靠的数据传输,主要任务是错误检测和纠正,以及数据帧的传输和访问控制。移动蜂窝网络:如4G LTE和5G,通过移动基站提供的无线信号实现移动设备的互联网接入。网络层:负责数据包的路由和转发,主要任务是通过网络选择最佳路径,进行流量控制和拥塞控制。手机,服务器,路由器,电脑;

hiahiakk的博客 2255

Python控制Keysight DAQ973A/DAQ970A实现数据采集

本文介绍了如何通过编程实现Keysight DAQ973A数据采集系统的自动化温度测量。首先,通过GPIB线将PC与仪器连接,并使用热电耦测量线连接被测装置。接着,通过查阅Keysight官网提供的编程手册,获取了实现温度测量所需的SCPI指令。然后,使用pyvisa库编写代码,与仪器进行交互,发送SCPI指令并读取测量结果。代码中整合了配置和查询指令,并将测量结果转换为浮点数格式。最后,将整个流程封装为命令行工具,用户可以通过配置文件设置参数,并执行自动化测试,测试结果将保存为CSV文件。整个过程实现了温

xgh1951的博客 1884

More Effective C++之 Item M4:避免无用的缺省构造函数

缺省构造函数(指没有参数的构造函数)在C++语言中是一种让你无中生有的方法。构造函数能初始化对象,而缺省构造函数则可以不利用任何在建立对象时的外部数据就能初始化对象。有时这样的方法是不错的。例如一些行为特性与数字相仿的对象被初始化为空值或不确定的值也是合理的,还有比如链表、哈希表、图等等数据结构也可以被初始化为空容器。 但不是所有的对象都属于上述类型,对于很多对象来说,不利用外部数据进...

janeqi1987的专栏 297

国科大学习资料--高级软件工程-复习题概念解释答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题概念解释答案 1. 敏捷开发方法与Scrum方法 a.敏捷是一种强调轻量的过程方法论,它强调拥抱变化而不是与之对抗,通过有效的沟通发挥群体的智慧。敏捷方法采用迭代/增量开发的过程模型。敏捷宣言是:个体和交互高于流程和工具;工作的软件高于详尽的文档;客户合作高于合同谈判;响应变化高于遵循计划。 虽然右边的也有价值,但是认为左边的更有价值。 b.Scrum(Schwaber和Beedle)是管理两个披萨规模(4-9人)的软件开发团队的方法,它高频率的短会

无名何许人的博客 1443

缺省构造函数

第4章:初始化与清除 本篇博客主讲 缺省构造函数

longj's coding workbench 3543

8.30华为OD机试真题 新系统 - 单词搜索计数 (Java/Py/C/C++/Js/Go)

8.30华为OD机试真题 新系统 - 单词搜索计数 (Java/Py/C/C++/Js/Go)

算法大师! 598

SerDes系列之 SSC扩频时钟技术

扩频时钟,又称展频(SSC-Spread Spectrum Clocking),当前PCIE、DDR、USB等几乎所有的高速接口都支持SSC的功能。电子工程师在日常的电气测试中经常与之接触,在电磁传导和辐射发射验证过程中,经常需要使用到芯片的SSC功能,它的物理表现形式,就是信号的比特率会在一个很小的范围内浮动,多见于周期性变化的时钟信号。

一只豌豆象的博客 3441

避免无用的缺省构造函数

缺省构造函数(指没有参数的构造函数)在C++语言中是一种让你无中生有的方法。构造函数能初始化对象,而缺省构造函数则可以不利用任何在建立对象时的外部数据就能初始化对象。有时这样的方法是不错的。例如一些行为特性与数字相仿的对象被初始化为空值或不确定的值也是合理的,还有比如链表、哈希表、图等等数据结构也可以被初始化为空容器。  但不是所有的对象都属于上述类型,对于很多对象来说,不利用外部数据进行完全的初

DX 1218

SCI投稿Title Page、Cover letter、Highlights、Manuscript模板

(简要介绍一下论文的创新性). I hope this paper issuitable for “Journal Name”.版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/weixin_48615832/article/details/120317336。

qq_15963745的博客 3700

《认清C++语言》---也谈C++关键字explicit

c++中的explicit关键字用来并且只能用来修饰类的构造函数,表明该构造函数是显式的,“显式”的意思是说创建类对象时必须写出构造函数的名称,相对的,“隐式”指的是创建类对象时不必写出构造函数名,只需根据构造函数形参类型指定实参,由编译器进行形参类型到类类型的隐式转换。《C++ Primer》指出:可以用单个实参来调用的构造函数,它自身定义了从形参类型到类类型的一个隐式转换。也就是说,如

ASCE1885 1795

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《认清C++语言》---堆对象

强制在堆中建立对象:有时候,我们要求某种类型的对象能够自我销毁,也就是能够“delelte this”,因此,我们需要将此类型的对象分配在堆上。由于非堆对象在定义它的地方被自动构造,在生存期结束时被自动释放,因此我们只要禁止使用隐式的构造函数和析构函数就可以限制对象在堆上分配内存。 最直接的方法是将构造函数和析构函数都声明为private,但这样副作用太大。因此,最好将析构函数置为pr

ASCE1885 1739

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 特性使用建议

使用引用替代指针且所有不变的引用参数必须加上const。在C 语言中,如果函数需要修改变量的值,参数必须为指针,如,在 C++ 中,函数还可以声明引用参数,定义引用参数防止出现 (*pval)++ 这样丑陋的代码。像拷贝构造函数这样的应用也是必需的,而且更明确,不接受 NULL 指针。建议:只在定义移动构造函数与移动赋值操作时使用右值引用,区分std::move与std::forward的作用。右值引用是一种只能绑定到临时对象的引用的一种,其语法与传统的引用语法相似,例如声明了一个其参数是一个字符串的右值引

Doublelv 的博客专栏。 1401

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++ 缺省构造函数

缺省构造函数(指没有参数的构造函数) 构造函数能初始化对象,而缺省构造函数则可以不利用任何在建立对象时的外部数据就能初始化对象 关于缺省构造函数的问题 #include<iostream> #include<string> using namespace std; class Person { public: string name; Person(string str){ name = str; //初始化姓名 } ~Person(); }; int mai.

qq_44647223的博客 1783
上一篇: 《计算机基础复习》===数据库技术基础
下一篇: 《认清C++语言》---接口继承和实现继承
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值