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

#include<iostream>#include<cstring>usingnamespacestd;classBook{char*title;char*author... #include<iostream>
#include<cstring>
using namespace std;
class Book
{
char* title;
char* author;
int numsold;
public:
Book(){} //这一行为什么要用?似乎去掉对程序也没有影响,是为什么?
Book(const char* str1,const char*str2,const int num)//这个以下的是函数吗?非得用Book这个名吗?
{
int len=strlen(str1);
title=new char[len+1];
strcpy(title,str1);
len=strlen(str2);
author=new char[len+1];
strcpy(author,str2);
numsold=num;
}
void setbook(const char *str1,const char *str2,const int num)/*这是什么,怎么它的大括弧里给上面的一样呢?好像去掉也没有关系,程序也是对的。*/
{
int len=strlen(str1);
title=new char[len+1];
strcpy(title,str1);
len=strlen(str2);
author=new char[len+1];
strcpy(author,str2);
numsold=num;
}
~Book()
{
cout<<"调用析构函数"<<endl;
delete title;
delete author;
}//这个析构函数好像去掉也可以的唉。为什么?

void print()
{
cout<<"书名:"<<title<<endl;
cout<<"作者:"<<author<<endl;
cout<<"月销售量:"<<numsold<<endl;
}
};
int main()
{
Book obj1("数据结构","严蔚敏",200);//为什么可以用obj1,没有定义为什么也可以来用?
obj1.print();
Book obj2("C++语言程序设计","李春葆",210);
obj2.print();
return 0;
}
运行结果如下:

问题有些多,但真的的确不懂啊,拜谢拜谢
展开
 我来答
CodeBlove
2014-08-19 · TA获得超过3364个赞
知道小有建树答主
回答量:936
采纳率:79%
帮助的人:248万
展开全部
学习过程要循序渐进,如果问题集中出现,先一个问题一个问题去弄懂去测试,其他暂时忽略。
重点: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释放内存空间。
笃侠6A
2014-08-19 · TA获得超过3734个赞
知道大有可为答主
回答量:3205
采纳率:75%
帮助的人:3277万
展开全部
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)/*这是什么,怎么它的大括弧里给上面的一样呢?好像去掉也没有关系,程序也是对的。*/——这是设置类数据成员值的函数,其函数体一般都与有参构造函数相同。如果去掉这个函数,则所创建的对象就无法改变其成员的值了。

//这个析构函数好像去掉也可以的唉。为什么?——如果没有这个析构函数,虽然运行不报错,但是在对象被释放时对象所占据的内存不能被释放,造成内存泄漏。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式