wmqskr 2020-11-04 18:03 采纳率: 0%
浏览 45

为啥减号的重载没有用?

friend Point & operator + (Point &p1, Point &p2);
friend Point & operator - (Point &p1, Point &p2);
Point & operator + (Point &p1, Point &p2)
{
   p1.x += p2.x;
   p1.y += p2.y;
    return p1;
}

Point & operator - (Point &p1, Point &p2)
{
   p1.x -= p2.x;
   p1.y -= p2.y;
    return p1;
}
    p1 = p1 + p2;
    cout<<"p1+p2="; p1.Display();
    p1 = p1 - p2;
    cout<<"p1-p2="; p1.Display();
加号的重载成功了,可是减号的重载就是不行,不知道为啥,请大神指教!
  • 写回答

1条回答 默认 最新

  • FXK YG 2020-11-04 21:26
    关注

    C++标准规定:

    8.1 并不是所有的操作符都能被重载。除了. ,.* ,:: ,? : ,sizeof,typeid这几个运算bai符不能被重载,其他运算符都能被重载
    8.2 重载不能改变该运算符用于内置类型时的函义,程序员不能改变运算符+用于两个int型时的含义。
    8.3 运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止程序员运用运算符改变内置类型的函义。
    8.4 重载不能改变运算符的优先级。
    8.5 重载不能改变运算符的结合律。
    8.6 重载不能改变运算符操作数的个数。比如+需要两个操作数,则重载的+也必须要有两个操作数。

    可看到,c++之所以不允许重载?:运算符,是考虑到?:运算符的条件特性。

    运算符的重载实质是函数的调用

    比如 A?B:C

    假设重载函数原型  operator ?: (A,B,C)

    那么,其跳转性质就不复存在了。

    举例说明:

    1
    2
    3
    4
    int a=0,b=0;
    bool p = true;
    p? (a = 10): (b = 10);
    //执行结果 a=10 b=0;
    转换为函数调用形式

    1
    2
    operator ?:(p,a=10,b=10);
    //执行结果 a=10 b=10
    显然 函数调用不能解决流程控制的问题,所以为了避免程序理解上的偏差,C++标准规定?:不能重载
    ——或是没有为什么bai,人家写代码时加个dufinal你就不能重载了。zhi
    有可能是人家觉得这个dao运算符他写的代4102码很牛b了,不需1653要你修改了。
    还有可能是因为人家不想你去重载,怕破坏了编程规则和C++编程习惯之类。
    java中的String类型也是不能重载的。没有为什么。就是人家规定的而已

    评论

报告相同问题?

悬赏问题

  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 武汉岩海低应变分析软件,导数据库里不显示波形图
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。
  • ¥30 win c++ socket
  • ¥30 CanMv K210开发板实现功能
  • ¥15 C# datagridview 栏位进度
  • ¥15 vue3页面el-table页面数据过多
  • ¥100 vue3中融入gRPC-web
  • ¥15 kali环境运行volatility分析android内存文件,缺profile