gpt4 book ai didi

c++ 在自定义异常的方法/构造函数签名中有和没有 throw()

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:30 24 4
gpt4 key购买 nike

我是 C++ 的初学者,因此对这个愚蠢的问题深表歉意。我将它发布在这里是因为我在 stackoverflow 上找不到类似的答案。

我正在处理 C++ 中的异常,并且在我动手处理自定义异常时,我有这段代码

class MyException: public std::exception{
public:
virtual const char* what() const throw() {
return "something bad happened";
}

};

// class that throws above exception

class canGoWrong {
public:
canGoWrong(){
throw MyException();
}
};

上面的代码是老师展示的。构造函数只是实现了基类 exception 中定义的虚函数。我到那儿了。

现在我在尝试不同版本的练习时,我尝试使用自定义函数而不是重新定义虚拟(因为c++没有严格执行接口(interface)的概念,如果我在这里错了请指正。 )

我是这样写的

class my_custom_shit_exception: public std::exception {
public:
const char* show() { // I omitted the const throw() here
return "This is an error encountered\n";
}
};

class myclass {
public:
myclass() {
throw my_custom_shit_exception();
}
};

总而言之,我没有发现两种方式的行为差异

public:
const char* show() {
return "This is an error encountered\n";
}
virtual const char* what() const throw() {
return "something bad happened";
}
  • 那么为什么 const throw() 用于 what() 虚函数?它有什么不同?

感谢大家。

最佳答案

函数签名

class std::exception {
//...
public:
virtual const char* what() const throw();
//...
};

可以理解为:whatstd::exception的虚成员函数,它返回一个指向常量字符(数组)的指针,并且不修改成员该对象的(因此是第二个 const)并且保证不会在其代码中抛出异常。

请注意异常规范现在已被弃用:相反,自 C++11 以来,有 noexcept 说明符来声明“保证”不抛出异常的函数。此外,自 C++17 以来,throw() 已成为 noexcept(true) 的同义词,但行为略有不同。

有关详细信息,请参阅 this descriptionnoexcept

它还说:“请注意,函数的 noexcept 规范不是编译时检查;它只是程序员通知编译器函数是否应该抛出异常的一种方法。编译器可以使用此信息可对非抛出函数进行某些优化 [...]”。

关于c++ 在自定义异常的方法/构造函数签名中有和没有 throw(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46011519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com