在声明char const *ptr ="某些字符"时是否有必要使用"const"?
Is is necessary to have the 'const' in declaring char const *ptr = "some characters"?
因为它们都指向不能修改的字符。在第一个函数中使用const的好处是什么?它只是告诉编译器注意任何可能做类似ptr[1] = 'a'
-
char const *ptr = "some characters"
-
char *ptr = "some characters"
是的,这样当你试图通过指针修改内容时,你将得到一个编译器错误,而不是在运行时令人讨厌的意外
在c++中,将const char[N]
(字符串文字的实际类型)转换为char *
已被弃用,并且在c++ 11中不再工作(c++ 11, c++ 03§4.2)。所以,第2条是刚刚被打破的。c++ 98/c++ 03编译器通常会产生一个警告;c++ 0x/c++ 11编译器应该完全拒绝。
const
的要点是编译器可以告诉您何时试图删除或违反它。即使您不打算修改这些字符,其好处是,如果您不小心修改了这些字符,则会发生错误。
您总是可以使用const_cast
来解决它,尽管在这种情况下,内存可能是只读的,物理上或通过MMU,无法解决任何问题。
使用const
很少是"必要的",从纯粹的"执行这段代码将得到预期的结果"的角度来看。
const
对于任何阅读代码并试图理解它的人来说都是一个巨大的帮助。这很有价值。我建议总是把const
放在它能工作的地方。
与此类似,出于几乎相同的原因,始终将旨在严格本地化的函数声明为static
。
建议:
char const *ptr = "some characters";
下面是不建议,因为您可能会尝试更改ptr
指向的const数据。
char *ptr = "some characters";
好的编译器应该在第二种情况下给出警告。
GCC(4.3.4)给出警告:
prog.cpp:7:警告:从字符串常量到' char* '的转换已弃用
See yourself: http://www.ideone.com/8FqyZ
这是告诉编译器注意任何可能试图改变字符串的代码。虽然,您可以聪明地更改字符串,但通常这是为了防止代码中的意外错误。
在C
中,以下两个定义都是完全合法和合理的。
char const *ptr1 = "some characters";
char *ptr2 = "some characters";
在C
中,字符串字面值是char[]
类型的值。在大多数情况下,它会衰减为char*
类型的值。对许多人来说,添加const
修饰符是一个好习惯:如果代码试图改变字符串字面量(这是未定义的行为),它会让编译器报错。
- 是否应该在模板化代码中完全避免const
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 知道模板参数在编译时是否为 const char*?
- "this"指向的对象是否与 const 对象相同?
- c++ 是否保证标头初始化的静态 const 成员跨编译单元和库共享单个实例?
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 如何检查函数是否真的获得了定义为 const 的变量?
- 修改数据是否由 const shared_ptr&Ok 传递?
- 从内部使用静态 std::string 的函数返回 const char * 是否安全?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- 将shared_ptr转换为<T> shared_ptr<const T>是否会更改它所指向的对象?
- const 是否允许在这里进行(理论)优化?
- 删除标头中用作函数参数的"primitive"类型前面的"const"是否更好?
- 在处理无状态对象时,将它们标记为const是否仍有性能优势
- 对于obj(obj*const a=obj const*b),int*const a=int const*b是否为tru
- const是否意味着C++11中的线程安全