相关文章推荐
刚毅的长颈鹿  ·  Windows10 ...·  2 周前    · 
任性的弓箭  ·  while循环·  6 月前    · 
int Length()const; myString operator()(int pos, int len); myString& operator = (myString& ob); myString& myString::operator = (myString& ob) if(&ob!=this) delete[]ch; this->ch = new char[ob.maxSize]; this->maxSize = ob.curLength; strcpy(this->ch, ob.ch); this->curLength = ob.curLength; cerr<<"String copy error\n"; return *this; myString myString::operator()(int pos, int len) myString temp; if(pos<0 || len<=0 || pos+len-1>=this->maxSize) temp.curLength = 0; temp.ch[0] = '\0'; if(pos+len-1 >= this->curLength) len = this->curLength-pos; temp.curLength = len; for(int i=0,j=pos; ich[j]; temp.ch[len] = '\0'; return temp; int myString::Length()const return this->curLength; void myString::print() cout<ch<maxSize = sz; this->ch = new char[this->maxSize+1]; if(this->ch == NULL) cerr<<"Allocation ERROR\n"; exit(1); this->curLength = 0; ch[0] = '\0'; myString::myString(const char *init) int len = strlen(init); this->maxSize = (len > defaultSize) ? len : defaultSize; this->ch = new char[this->maxSize+1]; if(this->ch == NULL) cerr<<"Application Memory ERROR\n"; exit(1); this->curLength = len; strcpy(this->ch, init); myString::myString(const myString& ob) this->maxSize = ob.maxSize; this->ch = new char[this->maxSize+1]; if(this->ch == NULL) cerr<<"Application Memory ERROR\n"; exit(1); this->curLength = ob.curLength; strcpy(this->ch, ob.ch); #endif

在网上一番查找后找到一个类似问题

https://blog.csdn.net/u011068702/article/details/64443949

也就是说,在st1(0,4)时存在了一个临时变量,当把这个临时变量传给st时,由于在=重载函数声明中,参数为myString&,而并不是常量引用。

这个错误是C++编译器的一个关于语义的限制。

如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此, c++编译器加入了临时变量不能作为非const引用的这个语义限制

了解这个语义以后就简单了,只需给=重载参数加上const常量限制符

(类中=重载函数声明也别忘了要加上const)

加上以后程序的运行结果

可以,很正确。

c++中临时变量不能作为非const的引用参数

2019/12/14更新

最近看到一个类似问题,即C++11

int i=0;
++++i;//这样是可以的
i++++;//这样就是错误的

 我们知道前++就是直接对对象自增后返回对象,而后++会先返回记录当前值,在自增,最后返回一个无名的临时对象,那么 i++++就是让第一个后++返回的无名临时对象再自增,这样对C++是无意义的,所以这样就无法编译通过。//ps.这就是常说的  举一隅以三隅反  吧

不积小流无以成江河