首页 > 试题广场 >

下列表达式中错误的是?

[单选题]
有如下类模板定义:()
template<class T> class BigNumber{ 
    long n; 
public: 
    BigNumber(T i):n(i){}
    BigNumber operator+(BigNumber b)
    { 
        return BigNumber(n+b.n); 
    } 
};
已知b1,b2是BigNumber的两个对象,则下列表达式中错误的是?
  • 3+3
  • b1+3
  • b1+b2
  • 3+b1
   该题在effective C++里面讲到,由于3是常量,无法进行隐式类型转换,所有错了。修改如下:
  const BigNumber& operator+(BigNumber &a,BigNumber &b)
    { 
        returnBigNumber(a.n+b.n); 
    } 
同时将operator+函数声明为no-member函数,即可实现上面式子要求。

发表于 2016-08-08 15:43:02 回复(0)
所以砖家一般建议+这样的重载运算符不要定义成为成员函数
发表于 2015-11-12 16:15:11 回复(0)
虽然b是正确的,但这种隐式转换并不推荐,参考C++primer394页。
发表于 2015-10-15 10:32:19 回复(0)
我的理解是:
A.3+3    就是正常的3+3
B.b1+3    是BigNumber(b1)+BigNumber(3)
C.b1+b2    是BigNumber(b1)+BigNumber(b2)
D.3+b1    常数3无法匹配到此模版中的+重载函数,编译器无法识别
欢迎指正。。。
发表于 2015-09-26 10:43:51 回复(8)
D选项中+ 前面的操作数必须是一个BigNumber 的对象,3 不是此对象,所以错了!
发表于 2015-09-28 10:38:00 回复(2)
运算符重载调用形式其实是:b1.operator+(参数)  简写成b1+参数
B会进行类型转换 
D肯定不对啊,3是int类型 肯定无法调用b1的加法操作,所以D是错的
发表于 2016-01-14 16:56:52 回复(1)
3+3 : 普通的int 相加
b1+3 : 相当于 b1 + BigNumber(3),再调用重载的+运算
b1+b2 : 调用重载的+运算
3+b1 : 错误,b1无法自动转换成int。
发表于 2015-09-26 11:28:13 回复(2)
因为+运算符被定义为为成员函数,也就是说要想调用该成员函数,+左侧的运算对象必须是本类的类型。换一种等价写***一目了然:
3+3;调用内置类型的+运算符,和本题重载+运算符无关;
b1+3;等价于b1.operator+(3);成立
b1+b2;等价于b1.operator+(b2);成立
3+b1;等价于3.operator+(b1);显然3是一种内置类型,根本没有成员函数;
发表于 2018-05-03 10:07:50 回复(0)
我的理解是因为operator+被定义为了一个成员函数,因此this指针指向的是左操作数,故此时B和C都是正确的,因为这里把+视为了其左操作数的成员函数,而右操作数为+的参数。而D不对是因为此时3为一个整形变量,此时的+号运算默认为基本加号运算而不是重载之后的加号运算。我测试了一下,如果把重载+换为非成员函数,那么此时D也是正确的
发表于 2016-09-03 15:51:06 回复(1)
如果你需要为某个函数的所有参数(包括this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个非成员函数。------《Effective C++》
发表于 2020-03-21 20:51:37 回复(0)
mark。第二次做错了。B中3是操作符+的右操作数,会进行隐式类型转换,而如果左操作数是数字的话,(*this).operator+就匹配不上了,会出错。
发表于 2017-01-17 09:16:38 回复(0)
我的理解是因为operator+被定义为了一个成员函数,因此this指针指向的是左操作数,故此时B和C都是正确的,因为这里把+视为了其左操作数的成员函数,而右操作数为+的参数。而D不对是因为此时3为一个整形变量,此时的+号运算默认为基本加号运算而不是重载之后的加号运算。我测试了一下,如果把重载+换为非成员函数,那么此时D也是正确的
发表于 2016-07-13 23:17:02 回复(0)
知识点:
定义为成员函数的双目操作符重载,左操作数必须是类的对象。
定义为友元函数可以破解这一限制。
编辑于 2015-10-14 00:01:15 回复(0)
operate+(int a),后置加 operate+(),前置+ 类比写日期类时,日期的前置和后置加加。
发表于 2018-05-23 16:47:55 回复(0)
定义为成员函数的双目操作符重载,左操作数必须是类的对象。
发表于 2017-07-19 08:26:08 回复(0)
如果是成员函数重载运算符,所以调用成员函数的对象(this指向的对象)被作为运算符的第一个操作数,所以对一元运算符无须再提供参数。使用成员函数重载二元运算符时,将当前(this指向的对象)作为左操作数,只需提供一个参数作为右操作数。

如果将运算符函数定义为全局函数,由于进行运算时往往要访问类的私有数据,所以一般将其声明为类的友元。重载一元运算符时需要提供一个类类型的参数,重载二元运算符时需要提供两个参数,分别作为左右操作数,其中至少一个参数必须是类类型的。

使用成员运算符的限制是左操作数必须是当前类的对象,左操作数不能进行自动类型转换,而全局运算符为两个操作数都提供了转换的可能性。因此,如果左操作数是其他类的对象,或是希望运算符的两个操作数都能进行类型转换,则使用全局函数重载运算符。

编辑于 2016-08-23 10:39:09 回复(0)
先说明一下,
    BigNumber operator+(BigNumber b)
    { 
        returnBigNumber(n+b.n);   ///这里等价于return  Bignumber(this->n+b.n)
    }
故调用重载的情况必须为加号的左操作数为Bignumber对象

A 3+3  没有调用重载的函数,就是普通的两个证书相加
B 3+b1  发生了类型的转换,把3转换为了BigNumber   temp(3),执行结果为b1+temp
C 很明显,调用了重载函数
D 左操作数没办法转化为Bignumber对象
故D选项的调用会发生错误

发表于 2018-04-10 08:52:57 回复(0)
你们心里难道就没点B数吗
发表于 2017-09-23 10:58:47 回复(0)
如果将运算符重载为类的成员函数,形参的个数要比该运算符需要的参数个数少1
因为成员函数具有隐藏的this指针
A选项为两个整数相加
B如果类中具有单个参数的构造函数,该构造函数具有类型转化的作用
C对两个Bignumber的对象相加
D错误
发表于 2022-09-22 20:19:18 回复(0)
当左操作数不是本类对象时,只能重载为类的友元函数。如果以类的成员函数形式进行重载,要么是重载单目运算符,要么左操作数是本类对象。所以重载双目运算符最好是重载为类的友元函数。
发表于 2021-11-22 17:35:04 回复(0)