C++12.4.3默认构造函数(不是非常明白)

本文深入探讨了默认构造函数的概念及应用场景,包括如何定义和使用默认构造函数,以及何时需要为类提供默认构造函数。此外,还讨论了合成的默认构造函数的规则,以及为何类应定义自己的默认构造函数。

简介

  • 只要定义了一个对象时没有提供初始化式,就使用默认构造函数。

  • 为所有形参提供默认实参的构造函数也定义了默认构造函数

  • 当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数

  • 合成的默认构造函数—–使用与变量初始化相同的规则来初始化成员。具有类类型(如:string)的成员通过运行各自的默认构造函数来进行初始化。内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象才进行初始化。当对象定义在局部作用域中,内置或复合类型的成员不进行初始化。

  • 使用默认构造函数定义一个对象的正确方式是去掉最后的空括号

==============================================================================================================================

  • 只要定义了一个对象时没有提供初始化式,就使用默认构造函数。

  • 为所有形参提供默认实参的构造函数也定义了默认构造函数(所以默认构造函数也是有形参的)

1、合成的默认构造函数

  • 一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数。根据:如果一个类在某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制。

  • 当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数,所以,无论如果类都有构造函数

  • 合成的默认构造函数—–使用与变量初始化相同的规则来初始化成员。具有类类型的成员(如:string)通过运行各自的默认构造函数来进行初始化。内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象才进行初始化。当对象定义在局部作用域中,内置或复合类型的成员不进行初始化。

  • 如果类包含内置或复合类型的成员,则该类不应该依赖于合成的默认构造函数。它应该定义自己的构造函数类初始化这些成员。

  • 每个构造函数应该为每个内置或复合类型的成员提供初始化式。没有初始化内置或复合类型成员的构造函数,将使那些成员处于未定义的状态,除了作为赋值的目标之外,以任何方式使用一个未定义的成员都是错误的。如果每个构造函数将每个成员设置为明确的已知状态,则成员函数可以区分空对象和具有实际值的对象。

2、类通常应定义一个默认构造函数

  • 默认构造函数是由编译器隐式应用的,如果类没有默认构造函数,则该类就不能用在这些环境中。
  • 假定有一个NoDefault类,它没有定义自己的默认构造函数,却有一个接受一个string实参的构造函数。因为该类定义了一个构造函数,因此编译器将不合成默认构造函数。NoDefault没有默认构造函数。意味着:
    • 具有NoDefault成员的每个类的每个构造函数,必须通过传递一个初始的string值给NoDefault构造函数来显示地初始化NoDefault成员;
    • 编译器将不会为具有NoDefault类型成员的类合成默认构造函数。如果这样的类希望提供默认构造函数,就必须显示的定义,并且默认构造函数必须显示地初始化其NoDefault成员。
    • NoDefault类型不能用作动态分配数组的元素类型。
    • NoDefault类型的静态分配数据必须为每个元素提供一个显示的初始化式。
    • 如果有一个保存NoDefault对象的容器,例如vector,就不能使用接受容器大小而没有同时提供一个元素初始化式的构造函数

3、使用默认构造函数—-Sale_item myobj= Sale_item();

//采用以下方式声明一个默认构造函数初始化的对象是错误的!!!
Sale_item myobj();

//编译没有问题,但我们试图使用myobj时
if(myobj.same_isbn(Primer_3rd_ed))//错误!!!myobj是一个函数
//编译器会指出不能将成员访问符号用于一个函数!!!问题在于myobj的定义被编译器解释为一个函数的声明,该函数不接受参数返回一个Sale_item类型的对象。使用默认构造函数定义一个对象的正确方式是去掉最后的空括号。

Sale_item myobj;
//或则
Sale_item myobj= Sale_item();

习题 12.27

先展示下效果 https://pan.quark.cn/s/5061241daffd 在使用Apache HttpClient库发起HTTP请求的过程中,有可能遇到`HttpClient`返回`response`为`null`的现象,这通常暗示着请求未能成功执行或部分资源未能得到妥善处理。 在本文中,我们将详细研究该问题的成因以及应对策略。 我们需要掌握`HttpClient`的运作机制。 `HttpClient`是一个功能强大的Java库,用于发送HTTP请求并接收响应。 它提供了丰富的API,能够处理多种HTTP方法(例如GET、POST等),支持重试机制、连接池管理以及自定义请求头等特性。 然而,一旦`response`对象为`null`,可能涉及以下几种情形:1. **连接故障**:网络连接未成功建立或在请求期间中断。 需要检查网络配置,确保服务器地址准确且可访问。 2. **超时配置**:若请求超时,`HttpClient`可能不会返回`response`。 应检查连接和读取超时设置,并根据实际需求进行适当调整。 3. **服务器故障**:服务器可能返回了错误状态码(如500内部服务器错误),`HttpClient`无法解析该响应。 建议查看服务器日志以获取更多详细信息。 4. **资源管理**:在某些情况下,如果请求的响应实体未被正确关闭,可能导致连接被提前释放,进而使后续的`response`对象为`null`。 在使用`HttpClient 3.x`版本时,必须手动调用`HttpMethod.releaseConnection()`来释放连接。 而在`HttpClient 4.x`及以上版本中,推荐采用`EntityUtils.consumeQuietly(respons...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值