面向对象程序设计中类的构造函数,析构函数的一些问题,想请大神针对下面的一个程序给我详细的解释。拜谢
发布网友
发布时间: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)/*这是什么,怎么它的大括弧里给上面的一样呢?好像去掉也没有关系,程序也是对的。*/——这是设置类数据成员值的函数,其函数体一般都与有参构造函数相同。如果去掉这个函数,则所创建的对象就无法改变其成员的值了。
//这个析构函数好像去掉也可以的唉。为什么?——如果没有这个析构函数,虽然运行不报错,但是在对象被释放时对象所占据的内存不能被释放,造成内存泄漏。