Вы можете написать совершенно корректный конструктор копирования и при этом иметь возможность передавать ссылку на NULL. Вы можете проверить на NULL, но только если вы не используете списки инициализации конструктора.
Пример:
MyClass::MyClass( MyClass const& MyClassCopy )
: somevar( MyClassCopy.somevar ) // <- the init list goes here.
{
// If MyClassCopy is NULL, the initialization above is doomed!
// However we can check for NULL in the constructor body but
// the initialization list must be removed ...
if (&MyClassCopy == NULL ) throw( std::runtime_error("NULL pointer!"));
somevar = MyClassCopy.somevar;
}
// I'll now do some very dangerous programming to
// demonstrate one way that a NULL can get through ...
MyClass* P = NULL;
MyClass A( *P ); // Bang, you're dead!
Насколько я знаю, нет способа проверить NULL из списка инициализации, поэтому, если вы думаете, что можете оказаться в ситуации, когда NULL проходит, вы должны проверить это в теле конструктора и выполнить инициализацию оттуда.
Не забудьте, что есть несколько ошибок с функцией :: operator = (), о которых нужно знать ...