问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

面向对象程序设计中类的构造函数,析构函数的一些问题,想请大神针对下面的一个程序给我详细的解释。拜谢

发布网友 发布时间:2022-04-06 14:53

我来回答

2个回答

热心网友 时间:2022-04-06 16:23

学习过程要循序渐进,如果问题集中出现,先一个问题一个问题去弄懂去测试,其他暂时忽略。
重点:new、delete两个关键词多了解下其作用。

例子中是一个Book类,而以类名作为函数的叫做构造函数,构造函数只在对象创建时由系统调用,用于初始化对象内部的成员变量(如果需要)。下面一个个解答。
1、Book(){}
函数接口中没有定义参数的,叫做无参构造函数,也叫默认构造函数,之所以叫默认构造函数,因为如果你去掉或没有定义,系统会自动提供一个无参构造函数,什么也不会做,只是为了统一接口规范或标准。当然你也可以在默认构造函数体内(大括号中)编写初始化代码。一般来说,无参构造函数所初始化的值是可以事先确定的。

2、Book(const char* str1,const char*str2,const int num)
该函数与类名同名,因此也是构造函数,区别在于这个函数是带参数的,所以叫有参构造函数。如果外部程序创建Book对象时需要使用一些外部(相对于对象内部)值去初始化对象内部的变量,就可以采用该函数创建对象。

比如:
//假设pstr1和pstr2是2个字符串指针
Book *pbook=new Book(pstr1,pstr2,100);
创建对象时就会调用该函数,将外部程序的2个字符串指针和一个整数常量传递给函数,用于初始化。

3、void setbook(const char *str1,const char *str2,const int num)/
这是普通函数,作用和2中所述的构造函数一样,你可以发现参数和代码都相同,都是用于初始化变量的。区别在于普通函数只有在对象创建之后显式调用。
比如
Book *pBook=new Book();//采用默认构造函数创建对象,也就是不进行初始化
pBook->setbook(pstr1,pstr2,100);//对象创建后,再显式调用setbook函数进行初始化对象成员的工作。

如此,Book类提供了两种初始化变量的途径,这样外部程序可以根据需要灵活选择,前者,创建对象前数据已确定时采用,后者,创建对象时数据不确定采用。

例子中,由于主函数main没有采用后者去调用setbook函数,所以去掉也不会受影响。

4、~Book()
在类名前面加个~号的函数叫析构函数,该函数仅在对象被释放的时候被执行,用于释放对象内部动态分配的内存,防止内存泄漏。此例中,析构函数释放了title和author两个指针指向的内存块。注意前面的delete关键词,该关键词用于释放指针指向的内存块。而这两个变量是char *类型,就是字符指针类型。同时注意构造函数中这两个指针都被指向了新建的内存块的地址。
title=new char[len+1];
author=new char[len+1];

去掉没有问题是因为这个程序简单,输出完程序就结束了,系统会在程序结束时自动释放所有动态分配的内存空间,但是如果程序复杂的话就会出现问题。

5、Book obj1("数据结构","严蔚敏",200);
此语句意思为创建一个obj1的对象,并以括号内的参数进行初始化,也就是调用了有参构造函数。

创建对象有两种方法(以调用默认构造函数举例):
一是静态创建,对象被分配在栈上,不返回指针,使用对象名作为别名,以映射内存地址。
Book obj1;
二是动态创建对象,对象被分配在堆上,返回的是指针。
Book * p1=new Book();

最后,凡是通过new的对象都需要delete释放内存空间。

热心网友 时间:2022-04-06 17:41

Book(){} //这一行为什么要用?似乎去掉对程序也没有影响,是为什么?——定义一个无参(默认)构造函数,如果去掉,就不能创建没有初始值的对象了。比如,Book b; 就会出错。

Book(const char* str1,const char*str2,const int num)//这个以下的是函数吗?非得用Book这个名吗?——这是(有参)构造函数,构造函数的名字必须与类名相同,所以必须用Book。

void setbook(const char *str1,const char *str2,const int num)/*这是什么,怎么它的大括弧里给上面的一样呢?好像去掉也没有关系,程序也是对的。*/——这是设置类数据成员值的函数,其函数体一般都与有参构造函数相同。如果去掉这个函数,则所创建的对象就无法改变其成员的值了。

//这个析构函数好像去掉也可以的唉。为什么?——如果没有这个析构函数,虽然运行不报错,但是在对象被释放时对象所占据的内存不能被释放,造成内存泄漏。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小红书怎么修改ID 专属ID更改方法 Win11如何更改字体视觉效果 Win11字体视觉效果修改方法介绍 华为团队管理模式 通信工程这个专业主要是学什么 专注力差的孩子该如何纠正 三岁的孩子专注力不好,怎么培养她的专注力呀!。 镇江关周围有什么玩的,镇江及周边旅游景点 大港南站去镇江汽车站怎么走 镇江汽车站到大港南站有多远 出国去澳大利亚留学都需要注意哪些事项呢? 澳大利亚留学条件及注意事项有哪些 侠岚第五季辗迟怎么失忆了 《侠岚》里的三魂是不是三魂之汰最厉害? 侠岚第五季:山鬼谣从来没有进化 侠岚一共有几集?几季? 侠岚第五季问题 侠岚第五季什么意思?怎么侠岚失忆了,还不能回玖宫岭? 侠岚第五季中哪一集找到弋痕夕并恢复记忆了 侠岚第五季辗迟的爸爸是谁 侠岚第五季展驰的来历 侠岚第5季辗迟的父母是谁 侠岚第五季什么时候出 侠岚第五季什么时候上映啊 侠岚第五季为什么山鬼谣没死 侠岚第五季辗迟零藏 侠岚第五季目录 侠岚第五季的来历 侠岚第五季简介 智能电视用无线网连接看电视用哪个软件最好最清晰 求一个电视猫tv版apk文件 个税手续费返还办完后多久到账啊 ipad连wifi不弹出认证网页? 大学生兼职简历应该怎么写? ipad怎么在网页登录wifi 学生应该如何撰写兼职简历? 苹果平板怎么链接需要认证的Wifi? 快递兼职怎么写进简历 ipad登陆wifi页面在哪 兼职个人简历怎么写 ipad连接移动的wifi怎么登录 iPhone,ipad连接WIFI时没有出现登录密码界面,直接自动连接。 求在校大学生找兼职的简历模版 需要登录的wifi怎么在ipad上登 写简历可以把兼职经历写上去吗? ipad连接不了需要网页认证的wifi your-wifi苹果平板登录上没弹出登录页面怎么办? 基本简历有哪些内容,兼职经历怎么写入简历 兼职的工作简历怎么写 目前在职,想白天找份兼职,简历应该怎么写? 如果做一份兼职工作,怎样写比较有说服力的简历呢? 麦当劳兼职简历怎么写