为什么要自己写构造函数和析构函数

为什么要自己写构造函数和析构函数

“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”

的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

 

类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化



拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用

String a(hello);

String b(world);

String c = a; // 调用了拷贝构造函数,最好写成 c(a);

c = b; // 调用了赋值函数 

    如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a, b 为例,假设a. m_ data 的内容为“hello”,b .m _data 的内容为“world”。现将a 赋给b,缺省赋值函数的“位拷贝”意味着执行b .m _data = a. m_ data。这将造成三个错误:一是b. m_ data 原有的内存没被释放,造成内存泄露;二是b. m_ data a. m_ data 指向同一块内存,a b 任何一方变动都会影响另一方;三是在对象被析构时,m_ data 被释放了两次。

### 回答1: 需要自己定义构造函数析构函数的情况有以下几种: 1. 当需要在对象创建时进行一些初始化操作时,可以定义构造函数来实现。比如,需要在对象创建时给成员变量赋初值或者打开一些资源。 2. 当需要在对象销毁时进行一些清理操作时,可以定义析构函数来实现。比如,需要在对象销毁时释放一些资源或者关闭一些文件。 3. 当需要控制对象的生命周期时,可以定义构造函数析构函数来实现。比如,需要在对象创建时进行一些操作,在对象销毁时进行一些清理操作,这样可以确保对象的正确使用。 总之,需要自己定义构造函数析构函数的情况主要是为了实现一些特定的需求,比如初始化、清理、控制对象的生命周期等。 ### 回答2: 在面向对象编程中,构造函数(Constructor)和析构函数(Destructor)是很重要的概念,它们用于创建和销毁对象,同时也可以执行一些额外的初始化和清理操作。那么,在什么情况下需要自己定义构造函数析构函数呢? 1. 需要进行的初始化操作 如果一个中有一些成员需要在对象创建时进行初始化,比如成员变量或静态变量等,那么就需要自己定义构造函数,并在其中对这些成员进行初始化。例如,我们可以在构造函数中为一个中的指针成员分配内存空间,或者为一些常量成员赋初值。 2. 需要进行资源管理 如果一个中使用了一些资源,比如内存、文件、网络连接等,那么就需要在对象销毁时及时清理这些资源,避免出现内存泄漏或者资源占用过多的情况。此时,就需要自己定义析构函数,并在其中释放所使用的资源。 3. 需要进行的继承和多态 如果一个需要继承自其他或者实现多态,那么就需要对构造函数析构函数进行重,以便完成继承或者多态的功能。例如,在派生中重构造函数析构函数,可以对基构造函数析构函数进行调用,以执行基所定义的初始化和清理操作。 总之,自己定义构造函数析构函数可以更好地满足自己的编程需求,可以在对象创建和销毁时进行一些自定义的操作,也可以更好地管理中的资源,进而保证程序的正确性和可靠性。 ### 回答3: 在学习面向对象编程的过程中,我们会接触到构造函数析构函数,这两个函数有着重要的作用,它们分别用于对象的创建和销毁,但是在实际的编码中,我们并不需要在每个中都自定义这两个函数,那么什么时候需要自己定义构造函数析构函数呢? 1. 构造函数 构造函数是用于对象的创建,负责初始化对象的成员变量。在以下情况下,我们需要自定义构造函数: (1)成员变量需要初始化为特定的值。默认情况下,的成员变量会被初始化为默认值,但是如果需要初始化为特定的值,我们需要自定义构造函数。 (2)对象需要进行参数化构造。有时候,我们需要针对不同的参数情况来创建对象,此时就需要使用参数化构造函数。 (3)需要进行一些额外的操作。有时候,我们需要在对象创建的过程中进行一些额外的操作,例如分配内存或者打开文件等,此时就需要自定义构造函数。 2. 析构函数 析构函数是用于对象的销毁,负责释放对象所占用的资源。在以下情况下,我们需要自定义析构函数: (1)中包含指针成员变量。如果一个中包含指针成员变量,那么在对象销毁时需要进行一些额外的操作,例如释放内存。此时,我们需要自定义析构函数来完成这些操作。 (2)中使用了特定型的资源,例如文件句柄或者网络连接等。在这种情况下,我们需要自定义析构函数来释放这些资源。 综上所述,需要自定义构造函数析构函数的情况主要涉及到成员变量需要初始化为特定的值、针对不同参数情况创建对象、需要进行额外的操作、中包含指针成员变量、中使用了特定型的资源等情况。在实际编码中,我们需要根据需求自行决定是否需要定义这两个函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值