C++操作符重载易错点

++和--重载

以++为例,分为前置++,和后置++

++的特性

前++(如++x)是左值,后++(如x++)是右值。内存中会保存左值,而不会保存右值。前++,先加后用;后++,先用后加。

	int x = 1;
	++(++x);(++x)++;
	++(x++);(x++)++;//error

前++

class Counter
{
	int value;
public:
	Counter(int x=0):value(x){}
	Counter& operator ++()//前置++,必须使用&,因为要返回本身
	{
		value++;
		return *this;
	}
}

后++

	const Counter operator ++(int) //后置加加,int 是哑元参数(dummy parameter),用于区分前置 ++(operator++())
	{                           //const是为了确保++(x++);或(x++)++报错。不能返回const Counter&,会造成悬垂指针
		Counter tem = *this;
		value++;
		return tem;
	} 

以上函数位于Counter类中。

C++操作符重载易错点_第1张图片

= 重载 

//重载赋值
class String
{
	int len;
	char* s;
public:
	String(const char* x)
	{
		len = strlen(x);
		s = new char[len+1];
		strcpy(s, x);
	}
	~String()
	{
		delete []s;
		s = nullptr;
	}
	String& operator =(String& b)//返回类型必须是类型的引用!这样支持链式赋值,且与内置类型的行为一致
	{                            //必须作为成员函数
		if (&b == this)
			return *this; //防止自身赋值
		delete []s;
		s = new char[b.len+1];
		strcpy(s, b.s);
		len = b.len;
		return * this;
	}
};

C++操作符重载易错点_第2张图片

C++操作符重载易错点_第3张图片

你可能感兴趣的:(c++,算法,开发语言)