我创建了一个书类,我作为我的作业的一部分工作,但它似乎有一个问题,我在下面的代码中没有理解, 这是我的代码
private:
Book (string N = " ", int p = 100, string A = "",
string P = "", string T = "", int Y = 2000)
{
cout << "Book constructor start " << N << endl;
Title=N;
pages=p;
Author=A;
Publisher=P;
Type=T;
Yearpublished=Y;
}
~Book(void)
{
cout << "Book destructor start " << Title << endl;
system("pause");
}
public:
static Book * MakeBook(string N = "", int p = 100, string A = "",
string P = "",string T = "",int Y = 2000)
{
return new Book(N,p,A,P,T,Y);
}
static void DelBook(Book * X) {
delete X;
}
在上面的代码中是构造函数和析构函数,我的问题是当我在NULL
函数中传递stactic void DelBook
作为参数时会发生什么?如下所示
static void DelBook(NULL)
{
delete NULL;
}
如果可以传递NULL值,我怎样才能编译?提前谢谢。
答案 0 :(得分:4)
只要DelBook
只调用delete
- 没有任何反应,它就是无操作。 (并且可以使用DelBook
作为参数值调用NULL
,无需额外操作。
答案 1 :(得分:0)
NULL
是一个有效的指针:它指向内存位置零。因此,您可以将NULL传递给带有Book*
指针的函数,因为它是一个Book*
指针。
此外,NULL是特殊的,不需要转换为Book*
- 您不需要说DelBook((Book*)NULL)
。因此,该程序应该已经编译。
删除空指针不会执行任何操作,因此您无需进行健全性检查。但是,如果您需要对Book
类的成员执行某些操作,则必须首先检查它是否为NULL:
static void DelBook(Book * X)
{
if (X){
x->tidyUpBeforeDeletion();
delete X;
}
}
无法检查这将导致段错误 - 这是取消引用空指针并且是非常坏的消息。
答案 2 :(得分:-1)
传递NULL本身通常不是问题。它基本上是0.删除NULL可能没有效果