const char * vs char *(C ++)

时间:2011-06-01 22:39:37

标签: c++

以下程序:

int DivZero(int, int, int);

int main()
{
    try {
        cout << DivZero(1,0,2) << endl;
    }
    catch(char* e)
    {
        cout << "Exception is thrown!" << endl;
        cout << e << endl;
        return 1;
    }
    return 0;
}

int DivZero(int a, int b, int c)
{
    if( a <= 0 || b <= 0 || c <= 0)
        throw "All parameters must be greater than 0.";
    return b/c + a;
}

使用char * e将提供

  

投掷后终止调用   'char const *'的实例

根据C++ Exception Handling,解决方案是使用 const char *

function (const char *) vs. function (char *)的进一步阅读说

  

“String”的类型是char*', not const char *'

     
    

(这是我认为的C讨论......)

  

关于Stack Overflow char* vs const char* as a parameter的补充阅读告诉我区别。但它们都没有解决我的问题:

  1. 似乎 char * string * 都限制了字符数。我是对的吗?
  2. 如何将关键字 const 添加到 char * 消除此限制?我认为 const 的唯一目的是设置一个表示“不可修改”的标志。我知道 const char * e意味着“指向不可修改字符类型的指针”。
  3. 该错误的解决方案是使用 const char * e

    即使是const字符串* e也不起作用。 (只是为了测试...)

    有人可以解释一下吗?谢谢!

    顺便说一句,我在UCCntu上,由GCC编译,在Eclipse上。

2 个答案:

答案 0 :(得分:21)

您链接到“String”的电子邮件错误(并且令人困惑)。

基本上:

char*是指向无界字符数组的指针。传统上,如果它包含一组有效字符后跟\0,我们认为这样的数组是C字符串。数组的大小没有限制。

const char*是指向不可变字符的无界数组的指针。

string*是指向std::string对象的指针,完全不同。这是一个封装字符串的智能对象。使用std::string代替C字符串可以让你的生活更容易,即使他们有一些粗糙的边缘和许多讨厌的陷阱;他们非常值得研究,但他们与这个问题无关。

"String"是一个特殊的表达式,它返回指向特定C字符串的const char*(注意:这实际上不是真的,但这是一个简化,让我能够简洁地回答这个问题)。 / p>

char*可自动转换为const char*,但反之亦然。请注意,旧的C ++编译器对类型规则有一个特殊的例外,允许您这样做:

char* s = "String";

...没有产生类型错误;这是为了C兼容性。现代C ++编译器不允许你这样做(比如最近的gccs)。他们要求:

const char* s = "String";

因此。这里的问题是你有:

throw "All parameters must be greater than 0.";

...但是你试图抓住它:

catch(char* e)

这不起作用,因为throw抛出const char*,不能强制转换为catch中指定的类型,因此它不会被捕获。

这就是将捕获更改为:

的原因
catch (const char* e)

......让它发挥作用。

答案 1 :(得分:18)

为什么你要扔掉和捕捉字符串呢?

您应该抛出并捕获异常,例如std::runtime_error

你的问题的答案是,无论何时你在代码中的引号中插入一个字符串,它都会返回一个空的终止const char *

你的代码不能像上面那样工作的原因是因为它是错误的类型,因此catch不会捕获你正在抛出的东西。你正在抛出一个const char *。

char数组中的字符数超出堆栈/堆的大小没有限制。如果你指的是你发布的例子,那个人已经创建了一个固定大小的数组,所以它们是有限的。