c ++最终常量字符串

时间:2010-12-08 20:45:00

标签: c++ pointers const final

在Java中,我们可以将字符串指定为final来声明'常量'。例如

static final String myConst = "Hello";

这样在c ++中执行此操作的正确方法是什么?

const char * const myConst = "Hello";

我一直看到人们这样做:

const char * myConst = "Hello";

但实际上,您可以更改指针指向的内容。那么,为什么人们不将指针声明为常量呢?这样做的正确方法是什么?

8 个答案:

答案 0 :(得分:12)

const std::string myConst("Hello");

答案 1 :(得分:5)

是的,const char* const是声明不会改变的C风格字符串的正确方法。

或更好:

#include <string>
const std::string myConst = "Hello";

答案 2 :(得分:1)

const char * myConst = "Hello";

这意味着指向的对象无法更改。

char * const myConst = "Hello";

这意味着指针指向的位置不能改变,但对象的值可以。

const char * const myConst = "Hello";

这意味着两者都不会改变。根据我的经验,没有人记得这个,但它总是在网上提供!

典型的,在我写我的时候有三个人回答!

答案 3 :(得分:0)

我不完全理解你的问题。要或多或少地模仿final Java关键字,它可能是

const char * const myConst = "Hello";

(如果指针不会改变),和/或:

const char * myConst = "Hello";

如果指针可能会在之后发生变化。最后,请注意,对于第一个版本,您实际上无法更改指针本身,因为它是常量。

答案 4 :(得分:0)

有了Diego的编辑,是的,这是写它的正确方法。人们通常不会声明变量const,因为他们不关心它是否会被修改,或者更确信它不会被修改(因为他们知道他们不会修改它)。

它们声明了指向的const因为字符串文字确实有const字符,所以你必须将它分配给一个具有char const *值的变量。

答案 5 :(得分:0)

从技术上讲,

char * const myConst = "Hello";

是最正确的答案,因为重新分配指针会留下一个可能无法恢复的字符串。

某些实现允许您更改“Hello”中的字符(即使这是一个坏主意),所以

中的第一个const
char const * const myConst = "Hello";

是个好主意。就个人而言

char const * myConst = ...;

和     const char * myCount = ...;

是等价的,我倾向于强制执行一个样式指南,即const总是跟随它修改的项目。从长远来看,它有时可以减少误解。

尽管如此,大多数人都不知道如何在C ++中正确使用const,所以它要么使用得不好,要么根本不使用。那是因为他们只是使用C ++作为改进的C编译器。

答案 6 :(得分:0)

  

但实际上,你可以改变一下   指针指向。那么,为什么呢   人们没有将指针声明为   也一直不变?什么是正确的   这样做的方法?

因为它很少有用,所以通常你会希望将堆栈上的值(包括指针)设置为非const。得到萨特&amp; Alexandrescu“编码标准”一书,它解释了这一点。

答案 7 :(得分:0)

真正的一点是,程序员必须至少声明一些指针const char *来在双引号之间存储char数组。没有任何强迫他们(没有编译器警告或错误)也使指针不变...因为人们懒惰你可以得出你自己的结论。他们可能甚至没有真正尝试定义常量,他们只是想关闭编译器错误(在这种情况下警告)。

记住这一点,无论如何我可能会寻求不同的解决方案:

const char myConst[] = "Hello";

这里的区别在于,这样我不会将用作字符串的原始字节数组衰减到指针,我仍然会有一个字节数组,可以完全用作原始文字。

有了它,我可以执行sizeof(myConst)之类的操作,并获得与sizeof("Hello")相同的结果。如果我将字符串更改为指针,sizeof将返回指针的大小,而不是字符串的大小......

...显然,当这样做时,改变指针变得毫无意义,因为没有指针可以改变了。