在Java中,我们可以将字符串指定为final
来声明'常量'。例如
static final String myConst = "Hello";
这样在c ++中执行此操作的正确方法是什么?
const char * const myConst = "Hello";
我一直看到人们这样做:
const char * myConst = "Hello";
但实际上,您可以更改指针指向的内容。那么,为什么人们不将指针声明为常量呢?这样做的正确方法是什么?
答案 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”中的字符(即使这是一个坏主意),所以
中的第一个constchar 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将返回指针的大小,而不是字符串的大小......
...显然,当这样做时,改变指针变得毫无意义,因为没有指针可以改变了。