常量字符* vs 字符* (C++)

const char* vs char* (C++)

本文关键字:字符 C++ vs 常量      更新时间:2023-10-16

对于以下程序:

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;
}

使用字符* e 将给出

在抛出 "char const*"的实例

根据C++异常处理,解决方案是改用 const char*

函数(const char *(与函数(char *(的进一步读数说

"字符串"的类型是 char*', not const char*'

(我认为这是一个C讨论...

关于堆栈溢出字符*与常量字符*作为参数的其他阅读告诉我区别。但是他们都没有回答我的问题:

    似乎字符*
  1. 字符串*对字符数都有限制。我说的对吗?
  2. 如何将关键字 const 添加到 char* 消除该限制?我认为 const 的唯一目的是设置一个"不可修改"的标志。我知道 const char* e 的意思是"指向不可修改的字符类型的指针"。

该错误的解决方案是使用 const char* e

甚至常量字符串* e 也不起作用。(只是为了测试...

谁能解释一下,请问?谢谢!

顺便说一下,我在Ubuntu上,由GCC编译,在Eclipse上。

您链接到的有关"字符串"的电子邮件是错误的(并且令人困惑(。

基本上:

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

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

string*是指向std::string对象的指针,完全不同。这是一个封装字符串的智能对象。使用 std::string 而不是 C 弦可以使您的生活负担更轻松,即使它们有一些粗糙的边缘和许多令人讨厌的陷阱;它们非常值得研究,但它们与问题无关。

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

char*可以自动投射到const char*,反之则不然。请注意,旧的C++编译器对类型规则有一个特殊的例外,允许您执行此操作:

char* s = "String";

。不会产生类型错误;这是为了兼容 C。现代C++编译器不会让你这样做(比如最近的 gcc(。他们需要这个:

const char* s = "String";

所以。这里的问题是你已经得到了:

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

。但是你试图抓住它:

catch(char* e)

这是行不通的,因为投掷的是抛出一个const char*,不能投射到捕获中指定的类型,所以它不会被抓住。

这就是为什么将捕获更改为:

catch (const char* e)

。让它工作。

你为什么要扔和接住绳子?

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

您的问题的答案是,每当您在代码中用引号插入字符串时,它都会返回一个以 null 结尾的常量字符*

你的代码不能像上面那样工作的原因是因为它的类型是错误的,所以那个 catch 没有捕捉到你扔的东西。你扔了一个常量字符*。

字符

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