【问题标题】:differences in constructor syntax when creating exceptions (c++)创建异常时构造函数语法的差异(c ++)
【发布时间】:2015-01-25 22:21:12
【问题描述】:

所以背景,我在 Java 编程语言方面有很强的背景。谈到 C++ 语言,我完全是个菜鸟。基本上我知道在 C++ 中定义构造函数有两种不同的语法,我只是不明白其中的区别。

如下编写异常构造函数时(类似于没有返回类型的方法),编译器输出no matching function for call to 'std::runtime_error::runtime_error()'错误:

#include <stdexcept>
using namespace std;

class DivideByZeroException : public runtime_error {
public :
    DivideByZeroException() {
        runtime_error("attempted to divide by zero.");
    }
};

但是,当构造函数修改为如下时,代码编译无错误:

#include <stdexcept>
using namespace std;

class DivideByZeroException : public runtime_error {
public :
    DivideByZeroException() :
        runtime_error("attempted to divide by zero."){};
};

有人可以解释一下这里发生了什么吗?

【问题讨论】:

    标签: c++ class c++11 constructor runtime-error


    【解决方案1】:

    在第二个示例中,冒号和左大括号之间的部分称为initialization list。这是您初始化成员和基类的地方。如果您不使用初始化列表(如在第一个示例中),则默认初始化您的成员和基类。但是std::runtime_error 没有默认构造函数,这就是您出错的原因。

    no matching function for call to 'std::runtime_error::runtime_error()'
    

    编译器正在尝试调用std::runtime_error 的默认构造函数,但它不存在。所以它必须在初始化列表中被初始化。至于你的第一个例子的构造函数中的代码行:

    DivideByZeroException() {
        runtime_error("attempted to divide by zero.");   // this one
    }
    

    构造一个与DivideByZeroException 对象的基本成员完全无关的临时runtime_error 对象。这个临时值在表达式的末尾被销毁。

    基本上我知道有两种不同的语法来定义 C++中的构造函数

    由此,我假设您的意思是(1)和(2)没有初始化列表的两种方式。这是真的,通常。但是,在某些情况下,如您的情况,只有一种方法。也就是说,带有一个初始化列表。

    【讨论】:

      【解决方案2】:

      异常没有什么特别之处。 (事实上​​,与 Java 不同,C++ 看不出异常类和任何其他类之间有任何区别,如果你愿意,你可以抛出整数。)

      构造函数只有一种正确的语法,它是第二种。第一个 sn-p 做了一些不同的事情:首先,它尝试不带参数调用基本构造函数(即,它与您编写 DivideByZeroException() : runtime_error() { runtime_error("message"); } 相同),然后它在构造函数主体中创建一个临时 runtime_error 对象,然后立即丢弃它(正文中的runtime_error 行与在Java 中单独编写new RuntimeException() 的效果大致相同)。

      发生错误是因为runtime_error 没有不带参数的构造函数,因此调用此类构造函数的隐式尝试失败。

      【讨论】:

        猜你喜欢
        • 2019-02-19
        • 2023-04-07
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 2013-11-13
        相关资源
        最近更新 更多