try
{
if (isfull()==1)
throw "full stack";
else
a[top++] = x;
}
catch (const char *s)
{
cout<<s;
}
为什么我们应该在catch块中使用const?如果我不使用它,我会收到此错误:
terminate called after throwing an instance of 'char const*'
Aborted (core dumped)
答案 0 :(得分:8)
因为你正在抛出一个字符串文字,并且字符串文字与指向常量内存的指针相同,因此需要const
。
答案 1 :(得分:6)
更一般地说,这是因为你的catch块没有捕获你正在抛出的异常,如果你不使用const。
但是,抛出非异常类型被视为不良形式;考虑抛出一个std::runtime_error
或从std :: exception派生的其他类型。您可以使用字符串构造大部分字符串,并从what()
属性中获取消息。
你仍然应该通过const引用来捕获它们,以防止复制和修改被捕获的对象(在任何情况下这都不是一个有用的东西):
try
{
throw runtime_error( "full stack" );
}
catch( const runtime_error & x )
{
cout << x.what();
}
catch( const exception & x )
{
// catch other exceptions derived from this base class.
}
答案 2 :(得分:2)
你的try块会抛出一个const类型字符串:“full stack”,这不是要在catch块中更改的。
在任何情况下,const char *都不能隐式地转换为char *。
如果catch接收char * s参数,s指向的内容可能会被s [...]赋值更改,这是不可接受的,导致内容(“full stack”)不变。
答案 3 :(得分:2)
因为您可以隐式地将less限定符的变量赋值给更多限定符 但你不能隐含地将MORE限定符的变量赋值给less限定符
例如
foo(char * p)
fooc(const char * p)
int main(int argc, char agrv[]) {
const char* cp = "hello";
char* p = new char[10];
foo(cp); // ==> compilation error
strcpy(p, cp);
fooc(p) // No probs assigning to a more qualified var
}
这就是为什么@Joachim Pileborg是对的:)。
答案 4 :(得分:0)
这不是那么简单。问题是在C ++中展示一些东西。 我们可以将“const char *”文字分配给“char *”
char* ss = "full stack"; //ok, although "full stack" looks like a const char*
const char* s2 = "full stack";
char* ss = s2 ; //not ok
用于处理C程序,C ++允许:char * ss =“full stack”; 顺便说说。在我的VS2005编译器中,没有任何事情发生(没有coredump)。
void main(){
try
{
throw "full stack";
}
catch (char *s)
{
std::cout << s <<std::endl;
}
}