C++中构造函数的条件

W4l*_*ker -3 c++ constructor

这个条件在构造函数中是正确的还是有更好的方法来做到这一点?

class Foo {
    public: Foo(int y) {
        if (y < 0 || y > 99)
           cout << "Error! Invalid input" << endl;

        else
            x = y;
        }

    private: int x;
    };
Run Code Online (Sandbox Code Playgroud)

Jan*_*net 5

C++中用于在构造时验证对象的一般模式(即防止创建无效对象)是在构造函数中抛出异常.这样你可以保证,如果你有一个类型为Foo的对象,它将被正确初始化或根本不被创建.

所以你会做的事情是这样的:

class Foo{
    public: Foo(int y) {
        if (y < 0 || y > 99)
           throw std::invalid_argument("y out of range");
        x = y;
    }

};
Run Code Online (Sandbox Code Playgroud)

在实例化时,你可以像这样捕获异常:

try
{
    Foo f(100);
    // do stuff with f
}
catch(std::invalid_argument& e)
{
    std::cout << "Construction of Foo failed" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如果你没有抓住它,它会冒出来,你可以在更高的层次上捕获它或者根本不捕获它,这将导致中止并退出应用程序.一般情况下,异常应该在一个明显如何正确应对特殊情况的地方捕获(比如在最简单的情况下向用户显示错误并继续执行).

  • 你没有_have_来捕获异常,通常最好处理异常只是让它们传播和展开堆栈. (2认同)