| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2025 人关注过本帖
标题:问一个关于运算符重载里面参数的问题。
只看楼主 加入收藏
tankMOwei101
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-9-25
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
问一个关于运算符重载里面参数的问题。
   friend Complex operator + (Complex c1,Complex c2);
事先定义了转换构造函数,但是接下来在这个友员函数定义里面,参数不能用引用Complex &c1,Complex &c2),用引用的话则会出现以下错误

binary '+' : no operator defined which takes a left-hand operand of type 'double' (or there is no acceptable conversion)
这个我想c4=i+c1; 这时i不是复数类型,调用转换构造函数,但是引用应该没关系的啊?原因实部是只能用值传递才能使得转换构造函数初始化?
我发现也可以把Complex(double r){real=r;imag=0;}修改成Complex(double &r){real=r;imag=0;}加一个引用符号,尽量减少时空开销。
我觉得尽管用了转换构造函数,可以使得运算符重载后不许重载更多就能适应交换律,但是这样,反而增加了时空开销,虽然不那么麻烦了。

    #include <iostream.h>
class Complex
{
public:
    Complex(){real=0;imag=0;}
    Complex(double r,double i){real=r;imag=i;}
    Complex(double r){real=r;imag=0;}
    friend Complex operator + (Complex c1,Complex c2);
    friend Complex operator - (Complex c1,Complex c2);
    friend Complex operator * (Complex c1,Complex c2);
    friend Complex operator / (Complex c1,Complex c2);
    void display();
private:
    double real;
    double imag;
};

Complex operator + (Complex c1,Complex c2)
{return Complex(c1.real+c2.real,c1.imag+c2.imag);}

Complex operator - (Complex c1,Complex c2)
{return Complex(c1.real-c2.real,c1.imag-c2.imag);}

Complex operator * (Complex c1,Complex c2)
{return Complex(c1.real*c2.real-c1.imag*c2.imag,c1.imag*c2.real+c1.real*c2.imag);}

Complex operator / (Complex c1,Complex c2)
{return Complex((c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),
                (c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag));}

void Complex::display()
{cout<<"("<<real<<","<<imag<<"i)"<<endl;}

int main()
{
    Complex c1(3,4),c2(5,-10),c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14;
    double i=5;
    c3=c1+c2;
    cout<<"c1=";c1.display();cout<<"c2=";c2.display();
    cout<<"c1+c2=";c3.display();

    c4=i+c1;
    cout<<"i="<<i;cout<<",c1=";c1.display();
    cout<<"i+c1=";c4.display();

    c5=c2+i;
    cout<<"i="<<i;cout<<",c2=";c2.display();
    cout<<"c2+i=";c5.display();

    c6=c1-c2;
    cout<<"c1=";c1.display();cout<<"c2=";c2.display();
    cout<<"c6=c1-c2=";c6.display();

    c7=c1-i;
    cout<<"i="<<i;cout<<",c1=";c1.display();
    cout<<"c7=c1-i=";c7.display();

    c8=i-c2;
    cout<<"i="<<i;cout<<"c2=";c2.display();
    cout<<"c8=i-c2=";c8.display();

    c9=c1*c2;
    cout<<"c1=";c1.display();cout<<"c2=";c2.display();
    cout<<"c9=c1*c2=";c9.display();

    c10=c1*i;
    cout<<"i="<<i;cout<<",c1=";c1.display();
    cout<<"c10=c1*i=";c10.display();

    c11=i*c2;
    cout<<"i="<<i;cout<<",c2=";c2.display();
    cout<<"c11=i*c2=";c11.display();

    c12=c1/c2;
    cout<<"c1=";c1.display();
    cout<<"c2=";c2.display();
    cout<<"c12=c1/c2=";c12.display();

    c13=c1/i;
    cout<<"i="<<i;cout<<",c1=";c1.display();
    cout<<"c13=c1/i=";c13.display();

    return 0;
}
搜索更多相关主题的帖子: conversion Complex double friend 
2011-09-25 11:54
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:7 
操作符和对象是绑定的  什么对象能使用什么操作符!
你想1+2这么运算这是可以的  你想 1.0%2.0 就不行了 因为浮点数不能取余运算~ 而1%2就可以了!
基本类型对象都要选择对应类型的操作符 更何况 你自己定义的对象~
计算机这么知道你使用的操作符是要怎么运算的 如果 你定义 class A{int c;int b};A  a; class d=a+1;谁知道你要干什么是把a.c+1 还是 a.b+1 还是 全部都+1;
这里你不能使用friend Complex operator + (Complex& c1,Complex& c2);的原因是因为你下面有c2=c1+3;这种类型的语句存在; 如果你使用了这个语句就会发生混乱;   你将3赋值给c2 根本是2个不同类型; 你的思路根本不对!而你这条语句Complex(double r){real=r;imag=0;}更不好了 不能将引用指向一个不存在的东西;Complex& c2你这条参数就是Complex& c2=3; 这条语句怎么可能让编译通过@

[ 本帖最后由 jcw08120110 于 2011-9-25 15:19 编辑 ]

君生我未生 我生君以老
2011-09-25 15:04
tankMOwei101
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-9-25
收藏
得分:0 
回复 2楼 jcw08120110
哎,这个程序是书上的一个例题。

我想问的是那个重载操作符的函数参数为什么不能用引用型? 抱歉,前面我应该问清楚。

+操作符已经被重载了,乃觉得怎莫就八能用咧。
2011-09-25 22:22
jcw08120110
Rank: 8Rank: 8
来 自:南京
等 级:蝙蝠侠
帖 子:272
专家分:742
注 册:2009-6-8
收藏
得分:0 
我不是说过了吗????????

你下面有c2=c1+3;这种类型的语句存在; 如果你使用了这个引用语句就会发生混乱;   你将3赋值给c2 根本是2个不同类型; 你的思路根本不对!而你这条语句Complex(double r){real=r;imag=0;}更不好了 不能将引用指向一个不存在的东西;Complex& c2你这条参数就是Complex& c2=3; 这条语句怎么可能让编译通过@

你看c2=c1+3;这条语句什么意思他调用+操作符; 里面有2个参数; 如果你使用引用;那么就是friend Complex operator + (Complex &a1,Complex& a2);调用这个函数 让a1指向c1;让a2指向3; 而3是什么类型 能将复数类型引用指向一个数吗?所以就不能使用引用了!!!!!!!!!!!!!

君生我未生 我生君以老
2011-09-26 08:09
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:7 
干嘛用友元呢
2011-09-26 08:45
hoho568
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:378
注 册:2009-7-14
收藏
得分:7 
本身就不是引用的问题,而是你的操作符重载参数选择的不对;
friend Complex operator + (Complex c1,Complex c2);
这个+重载的参数是两个Complex对象,所以+两边必须是对象,而不能是别的类型。

至于你在这种形式下面friend Complex operator + (Complex c1,Complex c2)你的程序正确,并且能够正常运行,完全是一种巧合。
因为你的Complex类有一个声明了这个构造函数 Complex(double r);在C++里面默认如果类存在一个形参的构造函数时,可以将一个形参构造临时的类对象
也就是你的 c2= c 1+ 2;这个式子之所以正确,因为用2构造了一个临时对象。所以你的+重载侥幸正确;

但是如果你把变量声明称引用,问题就出来了。这个对象是临时生成的,根本就不存在,因此就不能实现隐式类型转换;也就不成立了。。
出错信息也很明显,没有实现重载。。

建议楼主写代码的话写清楚,这种方法不可取。你可以写重载函数friend Complex operator + (Complex c1,double c2)就全解决了。。。面对什么问题,用什么重载方式。
2011-09-26 17:29
我爱阿秋
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2021-4-17
收藏
得分:0 
回复 6楼 hoho568
//此处不可以用引用;原因如下:
 //首先考虑另外一个简单问题:函数的形参是double类型,如果实参是int类型,会自动进行类型转换。(int自动转化double)
 //但是如果形参是double类型的引用,而实参是int类型,系统只能报错,因为系统不会转换后再引用。(多了一步)
 //(结论引用时参数必须对应,且为变量。因为常量还没有分配内存,所以没有引用)
 //同理,函数的形参是Complex类型,如果实参是double类型(或者其他类型),会自动进行类型转换。
 //但如果是Complex类引用的话,那系统就又不会了。(因为也是需要转换后再引用)
 //因此不能用引用
 //退一步讲,即使系统会转换后再引用,那么c1(复数)+3.5这个式子中3.5是常量也是不能有引用的(因为引用是变量的别名)
2021-04-18 09:25
快速回复:问一个关于运算符重载里面参数的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025719 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved