gpt4 book ai didi

c++ - 在 C++ 中定义常量 C 字符串的正确方法?

转载 作者:IT老高 更新时间:2023-10-28 23:18:23 25 4
gpt4 key购买 nike

大多数时候我看到常量 C 字符串定义为:

static char const* MY_CONSTANT = "Hello World";

然而,指针本身不是const。像下面这样做不是更合适吗?

static char const* const MY_CONSTANT = "Hello World";

我认为有 2 个具有像这样的常量全局变量的目标:

  1. 不允许修改字符串
  2. 不允许变量指向其他任何东西

我只是假设在定义常量字符串时需要这两个目标。

另一件有趣的事是我被允许这样做:

int main()
{
auto MY_CONSTANT = "";
MY_CONSTANT = "Another String";
}

这告诉我 auto 将字符串推断为 char const* 而不是 char const* const

所以我有两个主要问题:

  1. 定义常量 c 样式字符串的最合适方法是什么(我想常量指针指向某物,是更普遍的问题吗?)。为什么选择其中之一?
  2. 关于我的 auto 示例,它为什么选择 char const* 是有道理的(因为它是常量数据数组,而不是指针本身)。我可以让 auto 推断为 char const* const 还是可以更改代码以使其产生这种类型?

最佳答案

如果它真的是一个常量,那么 constexpr 将是 C++11 的方法:

constexpr char const* MY_CONSTANT = "Hello World";

第一个例子:

static char const* MY_CONSTANT = "Hello World";

只是说我有一个指向具有静态存储持续时间的 char const 的指针,如果它在函数之外,它将使其成为全局变量。

如果我们要求指针也是 const,那么我们需要您介绍的第二种形式。这完全取决于指针是否确实应该为 const 。在大多数情况下,您看到没有顶级 const 的代码的原因是因为他们只是忘记将其放入,而不是因为他们并不意味着指针也是 const。

static 会有所不同,例如,如果您希望 const 成员是每个实例还是每个类:

class A
{
char const* const const_per_instance = "Other Const String";
public:
constexpr static char const* const const_per_class = "Hello World" ;
};

如果我们要求 const 是每个类的,那么我们需要使用 static 否则不需要。如果您不允许使用 constexpr,示例会略有变化:

class A
{
char const* const const_per_instance = "Other Const String";
public:
static char const* const const_per_class ;
};

char const* const A::const_per_class = "Hello World" ;

但本质是一样的只是语法不同。

第二个问题是 Gotw #92表示 auto 会丢弃顶级 const,举个例子如下:

const int   ci  = val;  
auto g = ci;

它说:

The type of g is int.

Remember, just because ci is const (read-only) doesn’t have any bearing on whether we want g to be const. It’s a separate variable. If we wanted g to be const, we would have said const auto as we did in case c above

引用的例子如下:

int         val = 0;  
//..
const auto c = val;

关于c++ - 在 C++ 中定义常量 C 字符串的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111271/

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