草庐IT

Constants

全部标签

c++ - C/C++ 宏而不是 const

这个问题在这里已经有了答案:Whatisthedifferencebetween#defineandconst?[duplicate](6个答案)关闭9年前。宏#defineMAX80等同于constintMAX=80;都是常量,不能修改。用宏代替常数整数不是更好吗?常数整数占用内存。宏的名称被预处理器替换为它的值,对吗?所以它不会占用内存。为什么我要使用constint而不是宏?

c++ - C++ 类中的 private const 是多余的吗?

假设我有一个类,其中有一个我不想更改的成员变量。假设没有setter函数,将该变量设为私有(private)const与仅将变量设为私有(private)之间有什么区别吗?私有(private):classConstFoo{public:Foo(inta);virtual~Foo();intval(){returnval_;}private:intval_;}私有(private)常量:classConstFoo{public:Foo(inta);virtual~Foo();intval(){returnval_;}private:constintval_;}看起来两者之间没有区别,因

C++:在常量指针指向的对象中调用非常量函数(错误 C2662)

我有一个带有指向对象的const指针的结构。它是const以便pointer不会改变,我不希望对象保持不变。我想在该对象中调用一个非常量函数,因此收到以下错误:errorC2662:'my_namespace::MyClass::myFunc':cannotconvert'this'pointerfrom'constmy_namespace::MyClass'to'my_namespace::MyClass&'ConversionlosesqualifiersstructMyStruct{MyStruct(constMyClass*init_my_class_ptr);constMyC

c++ - 为什么编译器允许你在这里 "write"一个 const 变量?

为什么你可以这样欺骗编译器:constinta=5;*((int*)&a)=5;//VC/armccdoesnotcomplain当上面是这样的“删节”时:constint*ptr2const=&a;int*ptr=ptr2const;//asexpectederrorisraisedhere*ptr=5; 最佳答案 转换是您告诉编译器“我知道我在做什么”的方式,因此它不会提示。不幸的是,在这种情况下,您将调用未定义的行为。 关于c++-为什么编译器允许你在这里"write"一个cons

c++ 在签名中使用 const 的含义

请帮助我理解以下签名:err_typefuncName(constType&buffer)const;那么对于第一个const,这是否意味着Type的内容不能改变或者引用不能改变?其次,第二个const是什么意思?我什至没有任何提示。提前致谢,jbu 最佳答案 第二个const表示可以在const对象上调用该方法。考虑这个例子:classfoo{public:voidconst_method()const;voidnonconst_method();};voiddoit(){constfoof;f.const_method();//

c++ - 将部分可编辑对象的集合传递给算法

我用一个简单的例子简化了我的问题:immagine我管理一个元素集合std::vector,每个元素都有几个成员:structElement{public:doublefoo;doublebar;};然后,我想定义一个抽象类BarEvaluator,用于计算b值的算法来自a的值.我的第一个想法如下:classBarEvaluator{public:virtualvoidevaluate(std::vector&elements)const=0;};据此,我可以实现多种算法,例如计算bar的算法值为foo的平方值(value)观:classSqrBarEvaluator{public:v

c++ - 为什么 UuidFromString 函数请求非常量指针指向 unsigned char?

我不知道为什么UuidFromString函数需要非常量指向无符号字符的指针。为什么不用constchar*代替呢?我的想法是不需要修改第一个参数所指出的数据。 最佳答案 UuidFromString专为COM/DCOM而设计。unsignedchar是为了防止需要检查负数char值(默认char是signed,这意味着值的范围是[-128,127]-因为这个字符串应该是ANSI字符,这是避免条件检查的一种廉价方法)。它的姊妹函数(UuidToString)确实需要一个const输入参数。我在文档中看不到关于为什么UuidFromS

c++ - 为什么将 "pointer to pointer to non-const"转换为 "pointer to pointer to const"是不合法的

将非const指针转换为const指针是合法的。那为什么将指向非const的指针转换为指向const的指针是不合法的呢?例如,为什么下面的代码是非法的:char*s1=0;constchar*s2=s1;//OK...char*a[MAX];//akachar**constchar**ps=a;//error! 最佳答案 来自标准:constcharc='c';char*pc;constchar**pcc=&pc;//notallowed*pcc=&c;*pc='C';//wouldallowtomodifyaconstobject

c++ - "constify" `std::pair` 的字段是否可以不被黑客攻击?

在C++中,编译如下代码:std::pairx;static_cast*>(&x);报错:error:invalidstatic_castfromtype‘std::pair*’totype‘std::pair*’我或多或少理解为什么会这样,因为在模板参数列表中对类型进行cv限定原则上可以给出“不兼容”的结果。即使在这种情况下它不知道,编译器也无法知道。无论如何,是否有一种非hackish的方式来执行此转换?我对使用reinterpret_cast持谨慎态度对于我之前遇到过的类型双关问题。另外,我不能使用临时变量,因为这是对性能至关重要的代码。编辑:这就是我正在做的。我正在实现与std

c++ - boost::fusion::for_each 中的函数对象不同于 std::for_each

在升级到更新的编译器并解决编译器错误时,我意识到boost::fusion::for_each要求传入的函数对象具有运算符const。示例来自Boost:structincrement{templatevoidoperator()(T&t)const{++t;}};...vectorvec(1,2);for_each(vec,increment());这当然没有改变。我没有意识到它与std::for_each不同,它不要求运算符是const。structincrement{templatevoidoperator()(T&t)//noconsthere!!!{++t;}};std::v