这个C++函数声明的含义是什么?

35
virtual const char* what() const throw()
{

}

据我所知,它是一个返回指向可变字符常量的常量指针的函数。其他部分我不太确定。有人可以帮忙吗?


6
你想让我解释其中哪一部分? - Konrad Rudolph
11个回答

39

关于const throw()部分:

  • const表示这个函数(它是一个成员函数)不会改变被调用的对象的observable state(可观察状态)。编译器通过禁止你从这个函数调用非const方法和禁止修改成员值来强制执行这一点。
  • throw()表示你向编译器承诺,这个函数永远不会允许异常抛出。这被称为异常规范(exception specification),长话短说,它是无用且可能具有误导性的。

1
异常规格说明的有趣观点在这里Larry Osterman也写了一篇关于它的博客文章,在Stack Overflow上也有一个关于它的问题:是否有用C++的throw修饰符? - Cody Gray
为什么声明为私有(private)? - ThunderPhoenix

13
这意味着what是一个虚成员函数,返回const char*类型,可以在const对象上调用(最后的const)。throw()表示它“有点”保证不会抛出任何异常。
请查看C++中的异常规范,注意它们在C++0x中已被弃用 :)

+1 非常有趣的链接。不知道这个网站!谢谢! - marscode

13

从左到右:

  • virtual - 此函数可以在派生类中被覆盖
  • const char* - 此函数返回一个指向常量(字符数组)的可修改指针
  • what() - 此函数不带参数
  • const - 此函数不会修改调用它的对象的非mutable成员,因此可以在其类的const实例上调用
  • throw() - 此函数不应抛出任何异常。如果抛出异常,将调用unexpected

3

虚函数返回一个指向不可修改的字符缓冲区的指针,不带任何参数,不修改其所属类的任何成员变量(即可以在const实例上调用),并且不会抛出任何类型的异常。


throw() 装饰符意味着它不会抛出任何异常,而不是它可以抛出任何类型的异常。 - Cody Gray

2

what()函数不带参数,返回一个指向const char的指针(因此您不能修改指针指向的内容,但可以修改指针本身)。它是虚函数,因此其行为可以在派生类中被覆盖。它不会抛出异常,并且不会修改其所属类的任何成员。


1
嗯,不对。throw()修饰符意味着它不会抛出任何异常。 - Cody Gray
是的,你说得对。那就是我想要写的。不知道我当时在想什么 :) 谢谢!已经更正了。 - OJ.

1
  1. virtual 这个关键字用于在派生类中重写基类中的函数
  2. const char* 这是一个指向常量字符的指针
  3. what 返回一个以空字符结尾的字符序列,可用于标识任何异常
  4. throw() throw 中的参数为空,因此它将为所有异常调用 std::unexpected
#include<iostream>
#include<exception>

class Myexception:public exception
{
    virtual const char* what() const throw()
    {
        return "My exception here";
    }
} myex;

int main()
{
    try() 
    {
        throw myex;
    }
    catch(exception &e)
    {
        cout<<e.what()<<endl;
    }

    return 0;
}

1
这是一个返回const char*的虚函数。方法末尾的const表示不允许更改调用它的对象的状态,也就是说不能修改对象的任何成员变量。throw()部分是异常说明,表示该方法不会抛出任何异常。

1
  1. virtual: 这意味着该函数可以在子类中重新实现,并且通过基类指针调用该方法将最终调用重新实现。

  2. const char * 不是指向可变字符的常量指针 - 它是另一种方式。

  3. const 表示此方法甚至可以在此类的 const 实例上调用。

  4. throw() 表示此方法不会产生任何异常。


1
关于函数后面的const:实际上有两个意思,一个是编译器理解的意思,另一个是通常的编程约定所表示的意思。就编译器而言,它只是将this指针变成了指向const的指针。const可以被强制转换掉,或者使用各种间接方式来修改对象的可观察状态。最终,这个const的含义取决于程序员想要表达的意思。
今天通常的约定是,它表示对象的可观察状态不会改变。对于“可观察状态”的合理定义而言。
关于异常规范:空的异常规范是无抛出保证,在考虑异常安全性时非常重要。标准的下一个版本已经废弃了异常规范,但它提供了其他一些指定函数永远不会抛出异常的手段。

0

它实际上返回一个指向常量字符块的可变指针。

其他内容已经由其他人解释过了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接