我了解const_cast适用于指针和引用。我假设const_cast的输入应该是一个指针或引用。我想知道如果输入是对constint的指针/引用,为什么它不会删除constness?以下代码按预期工作。const_cast带多级指针intmain(){usingstd::cout;#defineendl'\n'constint*ip=newint(123);constint*ptr=ip;*const_cast(ptr)=321;cout但是当我尝试使用指向constint的指针或引用constint时,值似乎没有改变。const_cast引用constintintmain(){us
我的类(class)中有一个const方法,它不能更改为非常量。在这个方法中,我需要调用一个非常量方法,但编译器不允许我这样做。有什么办法可以解决吗?这是我的代码的简化示例:intSomeClass::someMethod()const{QColorsaveColor=color();setColor(QColor(255,255,255));//Callingnon-constmethod//....setColor(saveColor);//restorecolorreturn1;} 最佳答案 你可以在this指针上使用cons
我需要在c中输入“helloworld”。我该怎么做?stringa="hello";constchar*b="world";constchar*C; 最佳答案 stringa="hello";constchar*b="world";a+=b;constchar*C=a.c_str();或不修改a:stringa="hello";constchar*b="world";stringc=a+b;constchar*C=c.c_str();少量编辑,以匹配111111给出的信息量。当您已经拥有string时s(或constchar*s,
我有一个类(class),我想要一些位掩码,其值为0,1,3,7,15,...所以本质上我想声明一个常量int数组,例如:classA{constintmasks[]={0,1,3,5,7,....}}但编译器总是会提示。我试过了:staticconstintmasks[]={0,1...}staticconstintmasks[9];//theninitializinginsidetheconstructor知道如何做到这一点吗?谢谢! 最佳答案 classA{staticconstintmasks[];};constintA::
我最近与另一位C++开发人员就const的以下用法进行了交流:voidFoo(constintbar);他觉得以这种方式使用const是一种很好的做法。我认为它对函数的调用者没有任何作用(因为要传递参数的拷贝,所以在覆盖方面没有额外的安全保证)。此外,这样做可以防止Foo的实现者修改其参数的私有(private)拷贝。因此,它既规定了实现细节,也公布了实现细节。不是世界末日,但肯定不是值得推荐的良好做法。我很好奇其他人对此问题的看法。编辑:好的,我没有意识到参数的const-ness并没有考虑到函数的签名中。因此,可以在实现(.cpp)中将参数标记为const,而不是在header(.
这更多是一个政策或历史问题。为什么决定不为std::string提供constchar*转换?是否担心有人会执行printf("%s",s)并相信它会自动转换?有没有关于这个问题的公开讨论? 最佳答案 自动施法几乎总是邪恶的。如果对constchar*进行强制转换,std::string也可能会自动强制转换为其他指针类型,这可能导致难以发现错误。有一个返回constchar*的c_str()方法,所以你仍然可以实现你所需要的。此外,类型转换在逻辑上不正确-std::string不等同于constchar*。
给出以下代码:constmyStrcodesArr[]={"AA","BB","CC"};myStr是一个包装了char*的类。我需要遍历数组中的所有项目,但我不知道项目的数量。我不想定义一个代表大小的const值(在本例中为3)使用类似的东西是否安全:constintsize=sizeof(codesArr)/sizeof(myStr);怎么办? 最佳答案 执行此操作的安全且清晰的方法是使用std::extent(C++11起):constsize_tsize=std::extent::value;
我一直听到这种说法,但我真的找不到const_cast邪恶的原因。在以下示例中:templatevoidOscillatorToFieldTransformer::setOscillator(constSysOscillatorBase&src){oscillatorSrc=const_cast*>(&src);}我正在使用引用,并且通过使用const,我可以保护我的引用不被更改。另一方面,如果我不使用const_cast,代码将无法编译。为什么const_cast在这里不好?同样适用于以下示例:templatevoidSysSystemBase::addOscillator(cons
我知道这么简单的函数会被内联:intfoo(inta,intb){returna+b;}但我的问题是,编译器不能自动检测到这与以下内容相同吗:intfoo(constinta,constintb){returna+b;}既然可以检测到,为什么我需要在任何地方输入const?我知道由于编译器的进步,inline关键字已经过时了。const不是该做同样的事情了吗? 最佳答案 您不会将const视为未修改变量的结果。你使用const来enforce你不修改它。如果没有const,您可以修改该值。使用const,编译器会报错。这是一个语义问
这个问题涉及我在尝试回答thisearlier,intriguingquestionaboutC-stylecastsandtypeconversions时在C++规范中注意到的内容。.C++规范在§5.4中讨论了C风格的强制转换。它表示强制转换符号将按此顺序尝试以下强制转换,直到找到一个有效的强制转换:const_caststatic_caststatic_cast紧随其后的是const_castreinterpret_castreinterpret_cast紧随其后的是const_cast.虽然我对使用static_cast的含义有一个非常直观的想法。后跟const_cast(例如