重载操作符有关问题
重载操作符问题
class test
{
public:
test(){}
~test(){}
test & operator=(const test &x);
private:
int a;
};
test & test::operator=(const test &x)
{
if (this != &x) //检查自付值
{
a = x.a;
}
return *this;
}
首先,比如定义有两个对象a,b ,对于语句a=b
=应该是函数的名称 吧 ,b应该是函数的实参吧 ,返回一个test型 的引用,形式是=b,为什么左边加了一个a就算 是调用了这个函数,请问应该怎样理解a=b这个语句是调用了该函数,用到了重载 操作符 ??
其次,为什么返回值 的类型是test &???
------解决方案--------------------
当执行 a = b 的时候,实际上是调用了
a.operator = ( b ) 这样的函数,负责把 b的值赋值给a(如果你的函数完成的是这样的功能的话).这是由编译器决定的,也就是说,如果在连续遇到一个标识符、操作符、标识符,并且,该标识符是 '= '号的情况,便将调用这个operator函数,这是编译器完成的事情,你只需要了解它就是这么做的就好了,至于为什么,你得问编译器的开发人员了。
另外,为什么要返回一个*this引用,最通常的一个回答是:让这种操作和内建型别具有一致的行为。尝试下面的代码
int a,b;
a = b = 10;
由于‘=’号的结合顺序是从右至左,所以这行代码应该被分解为下:
1.b = 10;
实际过程是 b = 10,然后 返回b的引用
2.a = (b = 10 );
实际过程是 a = b,再返回a的引用
之后再执行下面的代码:
(a = b) = 20;
你能猜测执行完这行代码之后a,b的值是什么吗?
如果你遵照规则来玩这个游戏,那么a应该是20,b应该是10
这是已经成为事实的东西,你不可能对int型别的行为进行更改,那么我们自己所写的型别就应该尽可能地参照这一规则来进行游戏。否则,有一天你发现你的游戏规则对每个类别都有它自己的规则,那么你到底想客户按照哪个规则来和你玩游戏呢?要知道,在大型开发中,类的数量是上以千计的。
class test
{
public:
test(){}
~test(){}
test & operator=(const test &x);
private:
int a;
};
test & test::operator=(const test &x)
{
if (this != &x) //检查自付值
{
a = x.a;
}
return *this;
}
首先,比如定义有两个对象a,b ,对于语句a=b
=应该是函数的名称 吧 ,b应该是函数的实参吧 ,返回一个test型 的引用,形式是=b,为什么左边加了一个a就算 是调用了这个函数,请问应该怎样理解a=b这个语句是调用了该函数,用到了重载 操作符 ??
其次,为什么返回值 的类型是test &???
------解决方案--------------------
当执行 a = b 的时候,实际上是调用了
a.operator = ( b ) 这样的函数,负责把 b的值赋值给a(如果你的函数完成的是这样的功能的话).这是由编译器决定的,也就是说,如果在连续遇到一个标识符、操作符、标识符,并且,该标识符是 '= '号的情况,便将调用这个operator函数,这是编译器完成的事情,你只需要了解它就是这么做的就好了,至于为什么,你得问编译器的开发人员了。
另外,为什么要返回一个*this引用,最通常的一个回答是:让这种操作和内建型别具有一致的行为。尝试下面的代码
int a,b;
a = b = 10;
由于‘=’号的结合顺序是从右至左,所以这行代码应该被分解为下:
1.b = 10;
实际过程是 b = 10,然后 返回b的引用
2.a = (b = 10 );
实际过程是 a = b,再返回a的引用
之后再执行下面的代码:
(a = b) = 20;
你能猜测执行完这行代码之后a,b的值是什么吗?
如果你遵照规则来玩这个游戏,那么a应该是20,b应该是10
这是已经成为事实的东西,你不可能对int型别的行为进行更改,那么我们自己所写的型别就应该尽可能地参照这一规则来进行游戏。否则,有一天你发现你的游戏规则对每个类别都有它自己的规则,那么你到底想客户按照哪个规则来和你玩游戏呢?要知道,在大型开发中,类的数量是上以千计的。