コンストラクタで初期化に失敗した(ファイルを開くことができなかった、など)場合、
例外を投げるべきか、それとも取りあえず黙って受け入れて
bool Foo::valid() const { return handle_ != 0; }
のような関数で各自チェックしてくださいね〜とするのとどちらがよいのでしょう?
後者の場合、強制はできないので
int Foo::do_something() {
    if (!handle_)
        return -1; //とか、例外を投げるとか
    //何かする。
}
のように他の関数でもいちいちチェックしなければなりませんよね?
それとも、コンストラクタを全部private or protectedにして
Foo *Foo::create() {
    //いろいろチェック。ダメならすぐ0返す
    return new Foo(/* 全部OKなparameters */);
}
Foo *f = Foo::create(/* parameters */); //失敗したら0がかえってくる
f->do_something();
のようにするのとどっちが良いのでしょう?