代码之家  ›  专栏  ›  技术社区  ›  vedant gala

无法理解此C++表达式的语法/结构

  •  1
  • vedant gala  · 技术社区  · 7 年前

    请允许我澄清一下,我在解释问题时可能使用了不正确的术语。请容忍我——一定要指出缺点,但我希望我的问题的本质能在字里行间表达出来。

    #include <iostream>
    #include <exception>
    using namespace std;
    
    struct MyException : public exception { 
       const char * what () const throw () {
          return "C++ Exception";
       }
    };
    
    int main() {
       try {
          throw MyException();
       } catch(MyException& e) {
          std::cout << "MyException caught" << std::endl;
          std::cout << e.what() << std::endl;
       } catch(std::exception& e) {
          //Other errors
       }
    }
    

    我以前学过C,现在正在努力学习C++。

    const char * what () const throw ()
    

    我阅读的内容 here 是吗

    1. const char * 是返回类型,是指向常量字符的指针,按惯例是以零结尾的字符串数组的第一个字符。

    2. what 是函数名

    3. () 是一个空参数列表,表示函数不接受任何参数

    4. const 常数 对象,并且不能直接修改对象的成员

    5. throw () 是一种异常规范,用于防止引发任何异常。

    但我不明白的是:

    当提到C中的函数时,我们将其定义为

    return_type function_ name
      {function_body;
      } 
    

    所以当我理解的时候 常量字符* 什么 必须是function_name;我不明白功能体是什么部分。

    我最近意识到 throw C++中的函数;但为什么会有 '()' 之后 ? 如果 throw() 是函数吗?那么它的返回类型是什么?我们在定义吗 投掷() 在这里或 what() 在这里

    2 回复  |  直到 7 年前
        1
  •  3
  •   sehe    7 年前

    这是一个不推荐使用的动态无抛出说明符。看见 here . 它不是一个额外的函数调用。相反,它指定了这个函数的行为,在这种情况下,它是否抛出异常,而在这种特殊情况下它不会抛出异常。

        2
  •  0
  •   Remy Lebeau    7 年前

    return_type function_ name
        {function_body;
        } 
    

    这同样适用于C++。只是,在这两者之间还可以有额外的可选说明符 function_name {function_body}

    所以当我理解的时候 const char * what 必须是function_name;

    我不明白功能体是什么部分。

    这正是你所期望的——花括号之间的部分:

    { return "C++ Exception"; }
    

    throw C++中的函数;

    它不是一个函数。

    但是为什么后面会有一个“()” 什么 ?

    ifthrow()是一个函数

    事实并非如此。这是资格赛 what() 根据合同规定,不存在任何例外情况。函数的括号 说明符说明函数可能引发的实际异常类型,如果不允许,则说明符可能为空。

    我们在定义吗 throw() 什么()

    什么()