首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于c++中的关键字“const”

关于c++中的关键字“const”
EN

Stack Overflow用户
提问于 2013-11-28 16:38:24
回答 5查看 174关注 0票数 3

根据c++语法,const int* const p意味着p所指向的值不能是rewritten.But,我发现如果我像这样编码:

代码语言:javascript
复制
void f(const int* const p)  
 { 
     char* ch = (char*) p;
     int* q = (int*) ch;
     (*q) = 3;  //I can modify the integer that p points to
 }

在这种情况下,关键字"const“将失去使用"const”的effect.Is吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-28 16:40:07

在这里,您正在丢弃constness:

代码语言:javascript
复制
char* ch = (char*) p;

实际上,你是在说“我知道我在做什么,忘记你是const,我接受后果。”C++允许您这样做,因为有时它可能是有用的/必要的。但它充满了危险。

注意,如果传递给函数的参数实际上是const,那么您的代码将导致未定义的行为(UB)。你无法从函数内部知道。

还请注意,在C++中,最好清楚地表明您的意图,

代码语言:javascript
复制
int* pi = const_cast<int*>(p);

这清楚地表明,您的意图是抛弃const。它也更容易找到。同样的关于危险和UB的警告也适用。

票数 6
EN

Stack Overflow用户

发布于 2013-11-28 16:45:44

如果const int* const p指向一个编译时间常数,那么您的示例将使应用程序崩溃,当丢弃不稳定时,您需要确定您正在做什么。

C++是一种成人语言,额外的能量永远不会为短暂的安全而牺牲,这是代码作者的选择,是留在安全区还是使用cast操作符,向C/asm移动一步。

票数 1
EN

Stack Overflow用户

发布于 2013-11-28 16:43:06

C/C++会让你做很多让你“伤害”自己的事情。在这里,抛弃const of p是“合法的”,因为编译器假定您知道自己在做什么。这是否是好的编码风格是另一回事。

当您这样做时,您将对它可能产生的任何副作用和问题承担责任。在这里,如果参数中指向的内存是静态内存,程序可能会崩溃。

简而言之,仅仅因为你能做某事并不意味着这是一个好主意。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20271046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档