C++基础学习笔记----第十三课(操作符重载-下)(二)

2014-11-24 03:12:35 · 作者: · 浏览: 2
nt) { A ret1 = *this; --a; --b; return ret1; } A& A::operator--() { a++; b++; return *this; } int main() { A a = 1; A b = 1; /*a.plus(); a.print(); b.plus(); b.print();*/ /*a++; b++; a.print(); b.print();*/ /*++a; ++b; a.print(); b.print();*/ /*a--; b--; a.print(); b.print();*/ --a; --b; a.print(); b.print(); return 0; }

注:重载++运算符的时候,前置比后置的++效率高很多。类的成员函数,隐含了一个this指针。操作符重载函数也不例外,也隐含了一个this指针。这个this指针是一个引用类型,所以,在返回的时候,也返回这个引用类型。而后置++操作,在函数中进行了一次值的拷贝,返回的不再是this指针指向的对象,而是一个副本。所以返回的就是一个类对象。

不要重载&& 和 ||运算符

1.从C++语法的角度来说,&&和||这两个运算符可以进行重载。

2.&&和||这两个运算符内置了短路规则(短路规则就是当某一个条件满足的时候就不再执行,在单个变量的时候不会发生太多问题,但是涉及到函数返回值的时候将会发生问题)。操作符重载是依靠函数重载来完成的。C++的函数参数都会被返回一个值,所以无法实现短路规则。

基本例程如下:

#include 
     
      

class A
{
private:
	int a;
public:
	A(int i)
	{
		a = i;
	}
	void print()
	{
		printf("a = %d\n",a);
	}
	bool operator|| (A& aa)
	{
		printf("123\n");

		return this->a && aa.a;
	}
	A& operator+ (A& aa)
	{
		A ret = 0;
		ret.a = this->a + aa.a;
		printf ("bugai\n");
		return ret;
	}
};

int main()
{
	A a = 1;
	A b = 1;
	
	if (a || (a + b))
	{
		printf ("CYX\n");
	}
	return 0;	
}
     

程序打印结果如下:

\

当程序运行时首先执行if(a && (a + b)),如果a,b是两个真正的变量,那么当判定a为真的时候程序将会直接打印CYX,并不会再继续判定(a + b),但是将"|运算符进行重载之后,if(a && (a + b))的实际格式如下:

if (a.operator|| (a.operator+ (b)))
所以这个判定是先从内层进行判定,然后根据+重载函数的返回值作为参数再调用||运算符重载函数,所以程序打印结果如上图。