我对以下代码中发生的事情有点困惑:constinte=2;int*w=(int*)&e;//(1)casttoremoveconst-ness*w=5;//(2)cout在(1)中,w指向e的地址。在(2)中,该值更改为5。但是,当显示*w和e的值时,它们的值不同。但是如果你打印w指针和&e的值,它们的值/地址是相同的。为什么e仍然包含2,即使它已更改为5?它们是否存储在单独的位置?还是临时的?但是w指向的值怎么还是e的地址呢? 最佳答案 正如我在评论中所说,一旦你修改了const值,你就处于未定义的行为状态,所以谈论正在发生的事情
众所周知,在C++中,字符串文字是不可变的,修改字符串文字的结果是未定义的。例如char*str="Hello!";str[1]='a';这将导致未定义的行为。此外,字符串文字被放置在静态内存中。所以它们存在于整个程序中。我想知道为什么字符串文字有这样的属性。 最佳答案 有几个不同的原因。一种是允许将字符串文字存储在只读内存中(正如其他人已经提到的那样)。另一个是允许字符串文字的合并。如果一个程序在几个不同的地方使用相同的字符串字面量,最好允许(但不一定要求)编译器合并它们,这样您就可以获得指向同一内存的多个指针,而不是每个指针占用
众所周知,在C++中,字符串文字是不可变的,修改字符串文字的结果是未定义的。例如char*str="Hello!";str[1]='a';这将导致未定义的行为。此外,字符串文字被放置在静态内存中。所以它们存在于整个程序中。我想知道为什么字符串文字有这样的属性。 最佳答案 有几个不同的原因。一种是允许将字符串文字存储在只读内存中(正如其他人已经提到的那样)。另一个是允许字符串文字的合并。如果一个程序在几个不同的地方使用相同的字符串字面量,最好允许(但不一定要求)编译器合并它们,这样您就可以获得指向同一内存的多个指针,而不是每个指针占用
classBase{public:virtualvoidfunc()const{coutfunc();deleted;return0;}为什么输出会打印“Thisisconstantbase”。但是,如果我在func()的基本版本中删除const,它会打印“Thisisnonconstantderived”d->func()应该正确调用Derived版本,即使Basefunc()是const对吗? 最佳答案 virtualvoidfunc()const//inBasevirtualvoidfunc()//inDerivedconst
classBase{public:virtualvoidfunc()const{coutfunc();deleted;return0;}为什么输出会打印“Thisisconstantbase”。但是,如果我在func()的基本版本中删除const,它会打印“Thisisnonconstantderived”d->func()应该正确调用Derived版本,即使Basefunc()是const对吗? 最佳答案 virtualvoidfunc()const//inBasevirtualvoidfunc()//inDerivedconst
我正在努力弄清楚可以在c++中的函数声明上放置“const”的各个位置之间的差异。const开头的区别是什么:constintMyClass::showName(stringid){...}最后的const就像:intMyClass::showName(stringid)const{...}另外,像这样在开头和结尾都有const的结果是什么:constintMyClass::showName(stringid)const{...} 最佳答案 constintMyClass::showName(stringid)返回一个constin
我正在努力弄清楚可以在c++中的函数声明上放置“const”的各个位置之间的差异。const开头的区别是什么:constintMyClass::showName(stringid){...}最后的const就像:intMyClass::showName(stringid)const{...}另外,像这样在开头和结尾都有const的结果是什么:constintMyClass::showName(stringid)const{...} 最佳答案 constintMyClass::showName(stringid)返回一个constin
考虑以下header并假设它在多个TU中使用:staticintx=0;structA{A(){++x;printf("%d\n",x);}};作为thisquestion解释说,这是违反ODR的,因此是UB。现在,thereisnoODRviolation如果我们的inline函数引用了一个非volatileconst对象并且我们不在该函数中使用它(加上其他规定),所以这在标题中仍然可以正常工作:constexprintx=1;structA{A(){printf("%d\n",x);}};但如果我们碰巧使用它,我们又回到了与UB的第一方:constexprintx=1;struct
考虑以下header并假设它在多个TU中使用:staticintx=0;structA{A(){++x;printf("%d\n",x);}};作为thisquestion解释说,这是违反ODR的,因此是UB。现在,thereisnoODRviolation如果我们的inline函数引用了一个非volatileconst对象并且我们不在该函数中使用它(加上其他规定),所以这在标题中仍然可以正常工作:constexprintx=1;structA{A(){printf("%d\n",x);}};但如果我们碰巧使用它,我们又回到了与UB的第一方:constexprintx=1;struct
按照ScottMeyers的说法,为防止在getter的const版本和getter的非常量版本中重复代码,请从非常量版本调用方法的const版本:static_cast(*this).Methodology();然而,由于过度使用VisualAssistXIntellisense导致意外使用,我输入了:const_cast(*this).Methodology();而且效果很好。在这种情况下,使用特定类型转换有什么不同?使用的IDE:VisualStudio2010。 最佳答案 假设this的类型是A*,没有区别。通常const_