2011-03-08 99 views
14
virtual const char* what() const throw() 
{ 

} 

AFAIK它是一个函数,它将返回一个指向可变char的常量指针。其余的我不确定。任何人都可以帮忙吗?这个函数声明在C++中意味着什么

+5

你想解释哪部分? – 2011-03-08 09:18:50

回答

18

关于const throw()部分:

  • const意味着该功能(这是一个成员函数)将不会改变它被称为所述对象的可观察的状态。编译器通过不允许你从这个方法调用非const方法来执行此操作,并且不允许你修改成员的值。
  • throw()表示您向编译器承诺此函数绝不允许发出异常。这被称为例外规范,并且(长话短说)是无用的并且可能具有误导性。
+1

有关异常规范的有趣看法是[here](http://www.gotw.ca/publications/mill22.htm)。 [Larry Osterman](http://blogs.msdn.com/b/larryosterman/archive/2006/03/22/558390.aspx)也写了一篇关于它的博客文章,并且在Stack Overflow上有一个关于它的问题: [是否有任何使用C++抛出装饰?](http://stackoverflow.com/questions/1410226/is-there-any-use-for-c-throw-decoration)。 – 2011-03-08 09:26:19

7

这意味着what是一个返回const char*的虚拟成员函数,它可以在const对象(最后的const)上被调用。 throw()意味着它排序保证不会抛出任何东西。

退房exception specifications in C++,并注意它们在C++ 0X :)

+0

+1为非常有趣的链接。不知道这边!谢谢! – marscode 2014-05-27 10:23:12

3

虚拟函数返回一个指针,以字符的不可修改的缓冲液,不接受参数,不修改任何构件的变量弃用该类属于(即可以在常量实例上调用),并且不会抛出任何类型的异常。

+0

'throw()'装饰意味着它不会抛出任何异常,不会抛出任何类型的异常。 – 2011-03-08 09:23:44

+0

谢谢,改变了它。 – datenwolf 2011-03-08 09:26:27

1

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

+1

嗯,不。 'throw()'装饰意味着它不会抛出任何异常。 – 2011-03-08 09:22:51

+0

是的,你说得对。这就是我想要写的。不知道我在想什么:)谢谢!纠正。 – 2011-03-08 09:24:58

1

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

0

所有库异常的基类。

这是标准库和某些语言表达式引发的所有异常的基类。您可以自由派生自己的异常类,或者使用不同的层次结构,或者抛出非类的数据(例如基本类型)。

0
  1. virtual:这意味着该函数可以在子类中重新实现,并调用经由基类指针的方法最终会调用重新实现。

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

  3. const意味着甚至可以在此类的常量实例上调用此方法。

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

0

它实际上返回一个可变指针恒定字符块。

其余的已经被别人解释了。

6

从左至右:

  • virtual - 该函数返回一个修改的指针到一个常数(阵列)炭
  • what() - - 这此函数可以在派生类
  • const char*被覆盖函数不带参数
  • const - 此函数不会修改调用它的对象的(非mutable)成员,因此可以是cal在const上领导
  • throw() - 这个函数不会抛出任何异常。如果有,将会调用unexpected
0

关于功能后的常量:有实际上有两个含义 ,编译器了解什么,以及平时的 编程约定使它的意思。就编译器 而言,它所做的只是使该指针成为指向 const的指针。 const可以被抛弃,或者使用各种间接函数来修改对象的可观察状态。最后, 这个常量意味着程序员希望它意味着什么。

今天的惯例是,它意味着对象的可观察状态不会改变。对于某些 合理定义的“可观察状态”。

关于异常规范:一个空异常 规范是一个没有保证的规则,在考虑异常安全性时是非常重要的 。 标准的下一个版本已经弃用了异常规范,但它确实提供了一些其他方法来指定函数将不会抛出。

相关问题