5

我创建了一本书课,作为我作业的一部分,我正在学习它,但它似乎有一个问题,我在下面的代码中无法理解,这是我的代码

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在函数中传递 a 作为参数时会发生什么stactic void DelBook?像下面这样

static void DelBook(NULL)
{
    delete NULL;
}

如果可以传递 NULL 值,我该如何编译?提前致谢。

4

3 回答 3

5

只要DelBook只调用delete- 什么都不会发生,它就是无操作。(并且可以将您的DelBookwithNULL作为参数值调用,无需额外操作)。

于 2012-11-20T18:16:19.253 回答
0

NULL是一个有效的指针:它指向内存位置零。因此,您可以将 NULL 传递给接受指针的函数Book*,因为它是一个Book*指针。

此外,NULL 是特殊的,不需要强制转换为Book*- 你不需要说DelBook((Book*)NULL). 因此,该程序应该已经编译。

删除空指针没有任何作用,因此您不需要进行完整性检查。但是,如果您需要对Book类成员执行某些操作,则必须首先检查它是否为 NULL:

static void DelBook(Book * X)
{
    if (X){
        x->tidyUpBeforeDeletion();
        delete X;
    }
}

未能检查这将导致段错误 - 这是取消引用空指针并且是非常坏的消息。

于 2012-11-20T18:22:13.140 回答
-2

传递 NULL 本身通常不是问题。基本上是0。删除NULL大概没有效果

于 2012-11-20T18:17:17.397 回答