我正在阅读EffectiveC++,它告诉我“可以重载仅因常量不同而不同的成员函数”。书中的例子是:classTextBlock{public:constchar&operator[](std::size_tposition)const;char&operator[](std::size_tposition);private:std::stringtext;}我下面的示例使用了一个存储指针。classA{public:A(int*val):val_(val){}int*get_message(){returnval_;}constint*get_message(){returnval_
谁能解释一下为什么sizeof函数在下面的代码中返回不同的值?//staticmemberclassone{public:staticconstinta=10;};//nonstaticmemberclasstwo{public:inta;};intmain(){cout 最佳答案 您应该学习的第一件事是sizeof不是一个函数,它是一个运算符,就像+或||.那么关于你的问题。静态成员变量实际上在类中的方式与非静态成员变量相同,因此只有静态成员的类的大小为零。但同时所有对象都需要可寻址,因此具有,这就是为什么sizeof给你1头等舱
我有一个成员变量enabled_m,它的值取决于许多变量。由于这些不变量应该由类维护,我希望它是private:classfoo_t{public:voidset_this(...);//mayaffectenabled_mvoidset_that(...);//mayaffectenabled_mvoidset_the_other_thing(...);//mayaffectenabled_mboolis_enabled()const{returnenabled_m;}private:boolenabled_m;};这行得通,但实际上我的意图是要求foo_t的用户通过该类来修改ena
我正在向const方法添加一些惰性初始化逻辑,这使得该方法实际上不是const。有没有办法让我不必从公共(public)界面中删除“const”就可以做到这一点?intMyClass::GetSomeInt()const{//lazylogicif(m_bFirstTime){m_bFirstTime=false;Dosomethingonce}returnsomeint...}编辑:“可变”关键字在这里起作用吗? 最佳答案 使m_bFirstTime可变:classMyClass{::mutableboolm_bFirstTime
正在试用thestackeroverflowqn所以这让我想到为什么不重载函数,我想出了一个稍微不同的代码,但它说函数不能重载。我的问题是为什么?或者还有其他方法吗?#includeusingstd::cout;classTest{public:Test(){}intfoo(constint)const;intfoo(int);};intmain(){Testobj;Testconstobj1;intvariable=0;do{obj.foo(3);//Calltheconstfunctionobj.foo(variable);//Wanttomakeitcallthenonconst
根据我前一段时间阅读的一些教程,“const”声明使变量成为“常量”,即以后不能更改。但我发现这个const声明有点不方便,因为编译器有时会给出类似的错误“无法将constint转换为int”或类似的东西。而且我发现自己通过删除它作弊。问题:假设我小心翼翼地不更改我的源代码中的变量,我可以愉快地忘记这些const东西吗?提前致谢 最佳答案 你是认真的吗?为什么你会因为有时犯错而放弃这样一个有用的功能?更好地尝试和学习避免const的错误,并且您会受益于它为确保代码正确性而添加的强大帮助。当然,你可以告别语言提供的所有帮助,告诉编译器
这个问题在这里已经有了答案:Whataretheusecasesforhavingafunctionreturnbyconstvaluefornon-builtintype?(4个答案)关闭8年前。const的作用是什么?constObjectmyFunc(){returnmyObject;}我刚刚开始阅读EffectiveC++,第3项提倡这一点,Google搜索找到了类似的建议,但也有反例。我看不出在这里使用const会更好。假设按值返回是可取的,我看不出有任何理由保护返回值。给出的为什么这可能有用的示例是防止返回值的意外bool转换。那么实际的问题是应该使用explicit关键字
我有一个类structS{boolfoo(constAType&v)const{returnvalues.count(&v);//compileerrorduetotheconstnessofv}private:std::setvalues;};这是一个简化版本。在实际代码中,foo做了一些复杂的事情。代码产生错误invalidconversionfrom‘constAType*’to‘std::set::key_type{akaAType*}’我认为foo应该采用'constAType&v'因为它不会改变v。成员变量“values”的类型不能为std::set,因为结构S的某些方法调
例如,考虑用伸展树(SplayTree)实现的std::map。这种树结构是可变的,每次访问map进行读取时都会发生变化。当map为const时,谁必须保证并发读取的隔离,是由用户代码还是由map实现决定的? 最佳答案 提问者知道,如果您有写入集合的线程,则用户必须管理同步锁定。问题似乎是如果同时线程只读取集合,标准是否可以保证线程安全。我不确定旧的C++标准是否对任何操作的线程安全有任何保证,但新标准会(部分已在评论中给出,23.2.2)。事实上,大多数供应商现在确实保证并发读取之间的线程安全,尽管集合中包含的对象内的并发性显然需
很多人都说“volatile成员函数完全类似于const的工作方式。”如果指针被标记为const/volatile,则它们在某种意义上非常相似,它只能访问标记为const/volatile的成员函数。但实际上将成员函数定义为const有一个额外的效果,它使该函数成为只读的。函数内部对象的任何修改都会导致编译器错误。volatile成员函数中有这样的类似物吗? 最佳答案 好吧,volatile成员函数将使对象成员成为volatile,也就是说,this就像定义了volatileT*constthis一样。因此,对成员变量的任何引用也是