5

課題の一部として取り組んでいる本のクラスを作成しましたが、以下のコードでは理解できない問題が1つあるようです。これは、私のコードです。

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—何も起こらない、それは何の操作でもありません。DelBook(そして、パラメーター値としてwithを呼び出すことが可能でありNULL、追加のアクションは必要ありません)。

于 2012-11-20T18:16:19.253 に答える
0

NULLは有効なポインタです。メモリ位置ゼロを指します。Book*したがって、ポインタであるため、ポインタを受け取る関数にNULLを渡すことができBook*ます。

さらに、NULLは特別であり、キャストする必要はありませBook*ん-と言う必要はありませんDelBook((Book*)NULL)。したがって、プログラムはすでにコンパイルされているはずです。

nullポインターを削除しても何も起こらないため、健全性チェックは必要ありません。ただし、クラスのメンバーで何かを行う必要がある場合は、Book最初にそれがNULLでないことを確認する必要があります。

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

これをチェックしないと、セグメンテーション違反が発生します。これはnullポインターの間接参照であり、非常に悪いニュースです。

于 2012-11-20T18:22:13.140 に答える
-2

通常、NULL自体を渡すことは問題ではありません。基本的には0です。NULLを削除しても効果はないでしょう。

于 2012-11-20T18:17:17.397 に答える