gpt4 book ai didi

c++ - 为什么 "const int"到 "int"的转换有效,但 "const char[]"到 "char *"的转换无效

转载 作者:行者123 更新时间:2023-11-30 03:59:39 26 4
gpt4 key购买 nike

C++ 语言一直让我着迷。随着“const”标识符的出现,它应该取代使用#define 语句来声明常量。但是正如我声明要使用它们,我最终陷入了 const char 到 char 转换错误的疯狂状态。

最近,我说在类常量中做的事情就像在 Java 中做的那样。所以我决定宣布这样的事情。

private: const static int NB_FIELD = 22;

这非常有效。返回 int 的函数可以毫无问题地返回“const int”。

但是现在如果我尝试对这样的字符串执行相同的操作:

private: static const char ERRORSTR [ 6 ];

其中包含字符串“Error”,它会像这个函数一样产生 const char 到 char 的转换问题。

char* EnhancedSQLobject::get_SQLname ( int index )
{
if ( index < p_nb_field && index >= 0 )
return ( p_SQLfield_ptr [ index ] . SQLname)

return ( ERRORSTR );

}

现在有人会说改变 const char* 的返回值,但我不能,因为如果索引有效,它将返回一个非 const 变量,但如果索引无效,它将返回一个常量错误字符串。

所以我的选择是要么使错误字符串成为非常量,要么使用#define 语句创建一个常量。我记得很久以前试图将所有内容都定义为 const char,但最终它在转换链的其他地方爆炸了。使使用常规 char 变得更容易(String 类对我来说不是一个选项)

这太荒谬了,为什么要实现仅适用于一部分变量类型的功能。我想这与字符串实际上是字符表这一事实有关,因此它可能返回一个指针而不是一个值。

最佳答案

在一种情况下,您正在谈论将 const int 转换为 int,而在另一种情况下,您正在将 const char* 转换为 字符*。这些确实是不同的情况,应该有不同的行为,因为后者添加了一个间接级别(指针)。您完全可以将 const char 转换为 char,但这不是您正在做的。

考虑以下错误代码:

const int i = 50;
int j = i;
int* p = &i; // ERROR

我尝试执行 int j = i; 并且没问题。原始的 i 对象仍然是 const 并且 j 对象被赋予与 i 相同的值。但是,如果我尝试执行 int* p = &i;,我们就会遇到问题。如果这可以编译,我们会让 p 指向一个 const int,即使它告诉我们它指向一个非常量 int。这将允许我们通过指针 p 修改 const 对象 i - 这非常糟糕。

你在这里有同样的情况,只是 chars。 ERRORSTR 中的所有 char 都是 const。然后,您不能返回指向任何这些 charchar*,因为那是在说谎。指针不是指向非常量 char,而是指向 const char。

intchar 在这方面没有任何不同。

但是,我认为您只是因为界面设计不佳而陷入这种困境。为什么你的函数在找不到“SQLname”(不管是什么)时返回一个特殊的字符串?例如,如果字符串“Error”实际上是一个有效名称怎么办?函数的调用者将如何区分?我认为,如果您的函数无法完成 get_SQLname 的操作(也就是说,它无法获取名称),它应该抛出异常。

除此之外,您应该使用 std::string 而不是 C 风格的 char*

关于c++ - 为什么 "const int"到 "int"的转换有效,但 "const char[]"到 "char *"的转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com