草庐IT

constness

全部标签

c++ - "operator bool() const"是什么意思

例如:operatorbool()const{returncol!=0;}col是一个整数。operatorbool()const是如何工作的? 最佳答案 表单的成员函数operatorTypeName()是转换运算符。它们允许使用类类型的对象,就好像它们是TypeName类型一样,当它们是时,它们会使用转换函数转换为TypeName。在这种特殊情况下,operatorbool()允许类类型的对象像bool一样使用。例如,如果您有一个名为obj的类类型的对象,则可以将其用作if(obj)这会调用operatorbool(),返回结果

C++ 风格从 unsigned char * 转换为 const char *

我有:unsignedchar*foo();std::stringstr;str.append(static_cast(foo()));错误:invalidstatic_castfromtype‘unsignedchar*’totype‘constchar*’在C++样式中转换的正确方法是什么? 最佳答案 char*和constunsignedchar*被认为是不相关的类型。所以你想使用reinterpret_cast。但是,如果您要从constunsignedchar*转换为非const类型,则需要先使用const_cast。re

c++ - 我应该返回 const 对象吗?

在EffectiveC++第03条,尽可能使用const。classBigint{int_data[MAXLEN];//...public:int&operator[](constintindex){return_data[index];}constintoperator[](constintindex)const{return_data[index];}//...};constintoperator[]确实与int&operator[]有所不同.但是呢:intfoo(){}和constintfoo(){}看起来他们是一样的。我的问题是,为什么我们使用constintoperator[

c++ - const-correctness 是否给编译器更多的优化空间?

我知道它提高了可读性并减少了程序出错的可能性,但是它对性能的提高有多大?顺便说一句,引用和const指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但如何呢? 最佳答案 [编辑:好的,所以这个问题比我一开始想的要微妙。]声明指向const的指针或引用的const永远不会帮助任何编译器优化任何东西。(尽管请参阅此答案底部的更新。)const声明仅指示标识符将如何在其声明的范围内使用;它并不是说底层对象不能改变。例子:intfoo(constint*p){intx=*p;bar(x);x=*p;returnx;}编译器不

c++ - 错误 : invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’

错误的形式:int&z=12;正确形式:inty;int&r=y;问题:为什么第一个代码是错误的?标题中错误的“含义”是什么? 最佳答案 C++033.10/1说:“每个表达式要么是左值,要么是右值。”请务必记住,左值与右值是表达式的属性,而不是对象的属性。左值命名对象超出单个表达式。例如,obj、*ptr、ptr[index]和++x都是左值。右值是在它们所在的完整表达式末尾(“分号”)消失的临时值。例如,1729、x+y、std::string("meow")和x++是所有右值。地址运算符要求其“操作数应为左值”。如果我们可以获

c++ - 如何像 c 数组一样初始化 'const std::vector<T>'

有没有一种优雅的方法来创建和初始化conststd::vector喜欢constTa[]={...}到固定(和小)数量的值?我需要经常调用一个期望vector的函数,但在我的情况下这些值永远不会改变。原则上我想到了类似的东西namespace{conststd::vectorv(??);}因为v不会在这个编译单元之外使用。 最佳答案 对于C++11:vectorluggage_combo={1,2,3,4,5};原答案:您要么必须等待C++0x,要么使用Boost.Assign之类的东西。这样做。例如:#includeusingna

c++ - const char* 和 char const* - 它们是一样的吗?

据我了解,const修饰符应该从右到左阅读。从那,我明白了:constchar*是一个指针,它的char元素不能修改,但指针本身可以,并且charconst*是一个指向mutable字符的常量指针。但我收到以下代码的以下错误:constchar*x=newchar[20];x=newchar[30];//thisworks,asexpectedx[0]='a';//givesanerrorasexpectedcharconst*y=newchar[20];y=newchar[20];//thisworks,althoughthepointershouldbeconst(right?)y

c++ - 为什么 STL 映射的 [] 运算符不是 const?

为了这个问题,人为的例子:voidMyClass::MyFunction(intx)const{std::cout这不会编译,因为[]运算符是非常量的。这很不幸,因为[]语法看起来很干净。相反,我必须这样做:voidMyClass::MyFunction(intx)const{MyMapiter=m_map.find(x);std::coutsecond这一直困扰着我。为什么[]运算符是非常量的? 最佳答案 对于std::map和std::unordered_map,如果没有,operator[]会将索引值插入容器中't以前存在。这

c++ - 为什么 const 成员函数可以修改静态数据成员?

在以下C++程序中,从const函数修改静态数据成员工作正常:classA{public:staticinta;//staticdatamembervoidset()const{a=10;}};但是从const函数修改非静态数据成员不起作用:classA{public:inta;//non-staticdatamembervoidset()const{a=10;}};为什么const成员函数可以修改static数据成员? 最佳答案 这是规则,仅此而已。并且有充分的理由。成员函数上的const限定符意味着您不能修改非mutable非s

c++ - 删除指向 const (T const*) 的指针

我有一个关于const指针的基本问题。我不允许使用const指针调用任何非const成员函数。但是,我可以在const指针上执行此操作:deletep;这将调用本质上是一个非常量“方法”的类的析构函数。为什么允许这样做?是不是只是为了支持这个:deletethis;还是有其他原因? 最佳答案 为了支持://dynamicallycreateobjectthatcannotbechangedconstFoo*f=newFoo;//useconstmemberfunctionshere//deleteitdeletef;但请注意,问题不