对于类X的非const成员函数,this指针的类型为X*const。然后,成员函数的this指针始终为const。那么,我们是否总是需要像这样进行const转换:voidfoo::p(){const_cast(member)=1;}我是不是漏掉了什么? 最佳答案 ForanonconstmemberfunctionofclassX,thispointerisoftypeX*const.不,非const成员函数中的this指针的类型只是X*(而且它是一个右值)。但即使this是X*const,这仍然不会阻止您更改数据成员。您的代码示例
据我所知,在C++中,具有相同访问控制的结构/类成员按声明顺序存储在内存中。下一个例子m和c应该一个接一个地存储吗:#include#includestructX{mutableintm;intc;};constXcx={0,1};intmain(){X&x=const_cast(cx);x.m=rand();x.c=rand();std::cout在此示例中,程序运行并打印2个随机数。如果我删除mutable它会崩溃,因为cx存储在只读保护内存中。这让我想知道-是否有一个mutable成员禁用了整个struct的const优化(以某种方式使所有成员mutable)?是否可以将stru
例子:#defineVar135staticconstintVar1(35);因此,虽然#define在编译时将我使用过的所有地方Var1替换为35(我认为这会使编译时间略有增加)更长,如果你有很多,因为它解析代码),使用staticconstint使编译器认为它是一个变量。这是否意味着当使用staticconstint时,它会增加我的程序的内存印记,因为它必须为所有这些常量使用内存,或者这种开销是否被还是编译器?我问的原因是因为我想知道对于这种情况,在Debug模式下将它们作为staticconstint是否会更好(这样你就可以很容易地看到调试时的值),但在Release模式下将它们
这段C++代码是否正确?constsize_ttabsize=50;inttab[tabsize];问题是我已经看到很多关于这个问题的相互矛盾的意见。甚至##c++IRCchannel和编程论坛上的人也声称截然不同的事情。有人说上面的代码是正确的。其他人则认为不是,应该是这样的:constexprsize_ttabsize=50;inttab[tabsize];既然我已经被“C++专家”的相互矛盾的意见搞得够糊涂了,我能请问一个合理的支持答案吗?非常感谢! 最佳答案 在C++中,常量整数的处理方式与其他常量类型不同。如果它们是用编译
我有一个类似的函数(请不要关心通过引用返回临时值。这只是一个解释问题的例子),constfoo&get_const(){foof;returnf;}这显然无法编译。我正在寻找一种方法来确保调用者不会更改T的foo.我怎样才能确保这一点?我已经看到boost::shared_ptr的类似行为.shared_ptr可转换为constshared_ptr.我不知道它是怎么做到的。任何帮助都会很棒。 最佳答案 编译器看到foo和foo作为两种完全不同且不相关的类型,所以foo与任何其他转换一样,类需要明确支持这一点。如果您可以控制foo类,
考虑以下代码:structCalc{Calc(constArg1&arg1,constArg2&arg2,/**/constArgN&argn):arg1(arg1),arg2(arg2),/**/argn(argn),coef1(get_coef1()),coef2(get_coef2()){}intCalc1();intCalc2();intCalc3();private:constArg1&arg1;constArg2&arg2;//...constArgN&argn;constintcoef1;//Iwanttouseconstbecauseconstintcoef2;//no
我通常在C/C++代码中使用C类型转换。我的问题是,在转换类型中添加“const”关键字对结果有什么意义吗?比如我可以想出几个场景:constmy_struct*func1(){my_struct*my_ptr=newmy_struct;//modifymembervariablesreturn(constmy_struct*)my_ptr;//returnmy_instance;}在这个函数中,函数构造了一个结构的新实例,并将其转换为一个常量指针,因此调用者将无法进一步修改其内部状态,除非删除它。“const”转换是必需的、推荐的还是根本不需要的,因为任一return语句都有效。在这
我有一个对象:mapcollection;我想调用map::find函数,但我的键值为const,如以下代码,无法编译:constA*a=whatever();collection.find(a);以下代码有效并执行与查找操作等效的操作:constA*a=whatever();map::iteratoriter;for(iter=collection.begin();iter!=collection.end();++iter)if(iter->first==a)break;//iternowcontainstheresultormap::end(justlikemap::find)但它
我认为“const-correctness”的概念定义得很好,但当我和其他人谈论它时,我们似乎对它的含义有不同的看法。有人说这是关于一个程序在尽可能多的地方都有“const”注释。其他人将程序定义为const-correct当且仅当在使用const注释的地方没有违反constness时(即,它是编译器为您检查的属性)。所以我想知道,这些函数中哪些是const正确的:structPerson{stringgetName1()const{return_name;}stringgetName2(){return_name;}stringgetName3()const{_name="John"
我想使用模板函数来确定一个类型是否为const,例如:templateboolIsConst(TTYPE){returnfalse;}templateboolIsConst(constTTYPE){returntrue;}但这行不通,还有其他建议吗? 最佳答案 您要找的是std::is_const.如果你给它的类型是const,value将是true。否则,value将为false。这是您可以在该页面上找到的示例:#include#include//neededforis_constintmain(){std::cout::valu