我偶然发现了一些非常古老的代码,它有一个带有定义的复制赋值运算符的类,该运算符将其参数作为常量引用,但也不检查自赋值,因此本质上:structA{intq;A():q(3){}A&operator=(constA&a){q=a.q;return*this;}};当A的一个实例被赋值给它自己时,这个赋值运算符的行为是什么?我认为这会导致问题,因为它“破坏”了参数的常量性,任何编译器都可以假设参数没有更改并基于此进行优化。然而,clang和gcc都没有发出警告,程序运行正常。如果我在赋值运算符中赋值之前将q的值显式更改为4,这也有效。 最佳答案
谁能解释一下下面代码的输出结果?#include#includeclassAnimal{public:Animal(conststd::string&name):_name(name){}~Animal(){}virtualvoidprintMessage()const{std::coutprintMessage();}输出是Hello,I'mbillandmooHello,I'mbill我不明白为什么。指针animal指向Cow类型的对象。printMessage是一个虚函数。为什么Cow类的实现不是被调用的那个? 最佳答案 Co
可能重复:Whatdoesconstmeanfollowingafunction/methodsignature?我在C++的后期阅读中遇到了很多功能(特别是在Boost上),它有一个我以前从未见过的符号。virtualvoidB()const;你可以看到函数名后面有一个const!我看到const关键字主要是关于函数返回值(或作为参数)的,关于它们在函数中的用法,但这一个不同。有谁能告诉我它是什么,为什么我们要用它吗?它与函数上的const的传统用法有什么不同?int*constFunction(int*constconstantPointerToAnInteger,charcons
在C++中,我试图获得std::vector::iterator对于我的模板类。但是,当我编译它时,出现错误:errorC2146:syntaxerror:missing';'beforeidentifier'iterator',errorC4430:missingtypespecifier-intassumed.Note:C++doesnotsupportdefault-int.我也收到警告:warningC4346:'std::vector::iterator':dependentnameisnotatype:#includetemplateclassv1{typedefstd::
#includeusingnamespacestd;intmain(intargc,char*argv[]){inti1=0;inti2=10;constint*p=&i1;intconst*p2=&i1;constintconst*p3=&i1;p=&i2;p2=&i2;p3=&i2;cout代码可以用VC6.0和VC2010编译。但我有以下问题:constint*p=&i1;意思是“p”点不能修改,但是p不能修改,对吗?所以p=&i2;这条线可以遵守,是吗?这一行:intconst*p2=&i1;在我看来,这意味着p2不能修改,而p2点可以更改,对吗?为什么p2=&i2;可以编译吗
我尝试了以下行:staticconstconstchar*values[];但我在VC++警告C4114上收到以下警告:sametypequalifierusedmorethanonce.什么是正确的声明?目标是创建一个不可变的C字符串数组。 最佳答案 您编写了constconst而不是staticconstchar*constvalues[];(您将指针和基础值定义为const)另外,你需要初始化它:staticconstchar*constvalues[]={"字符串一","字符串二"};
根据我的理解,mutable取消了变量的constnessClassA{voidfoo()const{m_a=5;}mutableintm_a;};还有const_cast:voidprint(char*str){cout(c));return0;}那么,是什么改变了彼此?谢谢 最佳答案 const_cast无法取消对象的常量性。const_cast只能从对象的访问路径中移除constness。访问路径是对对象的指针或引用。从访问路径中删除常量性对对象本身绝对没有影响。即使您使用const_cast移除访问路径的常量性,仍然不一定会
为什么我会进入这段代码:voidfoo(constint**);intmain(){int**v=newint*[10];foo(v);return0;}这个错误:invalidconversionfrom‘int**’to‘constint**’[-fpermissive]|我认为可以将非常量转换为常量。 最佳答案 这是因为您正试图将int**转换为constint**int**v=newint*[10];//visint**foo(v);//butfootakesconstint**int**是:“指向整数指针的指针”。cons
假设我有一个列表,其中没有添加或删除新节点。但是,节点可能会被打乱。保存一个迭代器,指向列表中的一个节点,并在以后任意时间访问它是否安全?编辑(后续问题):list::splice()的文档说它从参数列表中删除元素。这是否意味着如果我调用splice,使用相同的列表作为函数的参数,现有的迭代器将失效? 最佳答案 是的。迭代器进入列表的标准受赠者不会失效,除非他们指向(比喻地说)的项目从列表中删除。从这个页面:http://www.sgi.com/tech/stl/List.htmlListshavetheimportantprope
这个问题在这里已经有了答案:Whatisthemeaningofaconstatendofamemberfunction?[duplicate](3个答案)关闭8年前。遇到两个const成员函数的解释classA{public:...voidf()const{}...}这意味着它只能访问常量成员;表示不修改任何成员;我觉得第二个是对的。但是为什么第一个出来呢?有什么需要澄清的吗?谢谢!