码迷,mamicode.com
首页 > 编程语言 > 详细

C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘myString’

时间:2019-09-10 18:10:58      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:art   iostream   image   函数返回   字符串   const   div   并且   ++i   

先看代码(不想看代码可以直接看代码后的问题描述)

//header.h
#ifndef _HEADER_H
#define _HEADER_H
#define defaultSize 128
#include<iostream>
#include<string.h>
using namespace std;
class myString
{
	private:
		char *ch;
		int curLength;
		int maxSize;
	public:
		myString(int sz=defaultSize);
		myString(const char *init);
		myString(const myString& ob);
		~myString(){delete []ch;}
		void print();
		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;
	}
	else
	{
		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‘;
	}
	else
	{
		if(pos+len-1 >= this->curLength)
			len = this->curLength-pos;
		temp.curLength = len;
		for(int i=0,j=pos; i<len; ++i,++j)
			temp.ch[i] = this->ch[j];
		temp.ch[len] = ‘\0‘;
	}
	return temp;
}

int myString::Length()const
{
	return this->curLength;
}

void myString::print()
{
	cout<<this->ch<<endl;
}

myString::myString(int sz)
{
	this->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

 

//main.cpp
#include"header.h"

int main()
{
	myString st(10), st1("ABCDEFG");
	myString st2(st1);
	st.print(), st1.print(), st2.print();
	st = st1(0, 4);//???
	st.print();
	return 0;
}

这是一个字符串类,问题出现在了两个符号重载,()和=

()重载是想对字符串对象做一个切片,返回一个临时对象,=重载就不用说了,就是赋值。

问题就出现在总是无法将这个切片后的临时对象赋值给等号前的对象,编译后如下:

技术图片

 

 

 

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

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

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

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

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

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

技术图片

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

加上以后程序的运行结果

技术图片

 

可以,很正确。

总结:

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

C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘myString’

标签:art   iostream   image   函数返回   字符串   const   div   并且   ++i   

原文地址:https://www.cnblogs.com/area-h-p/p/11498481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!