首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++有关问题。求大侠。困扰了好久了

2012-04-13 
C++问题。。。求大侠。。。困扰了好久了#includeiostreamusing namespace stdclass Complex{public:Complex()

C++问题。。。求大侠。。。困扰了好久了
#include<iostream>
using namespace std;

class Complex
{
public:
Complex();
Complex(double i, double j);
Complex(double r);
friend Complex operator + (Complex &a, Complex &b);
void display();
private:
double m_a;
double m_b;
};

int main()
{
Complex a(1,2);
Complex b(2,4);
Complex c;
c=a+b;
c.display();
c=Complex(2.5)+a;/*这里改为c=2.5+a;为什么不行?系统不是会自动调用转换构造函数吗?。但如果我把。friend Complex operator + (Complex &a, Complex &b);改为。friend Complex operator + (const Complex &a, Complex &b);就行了。。。或者改为friend Complex operator + ( Complex a, Complex b)。。。也可以。。这是为什么呢*/
c.display();
return 0;
}

Complex::Complex()
{
m_a=0;
m_b=0;
}

Complex::Complex(double i, double j)
{
m_a=i;
m_b=j;
}

Complex::Complex(double r)
{
m_a=r;
m_b=0;
}

Complex operator + (Complex &a, Complex &b)
{
return Complex(a.m_a+b.m_a,a.m_b+b.m_b);
}

void Complex::display()
{
cout<<m_a<<" "<<m_b<<endl;
}



问题在注释部分。。。谢谢,呵呵

[解决办法]
c = 2.5 + a ;
奇怪的问题,c是一个class,2.5是一个常数,a是一个class; 怎么加? 你期望它能给你返回什么值?
[解决办法]
VS2010

运行结果
3 6
3.5 2


有什么问题?
[解决办法]

探讨

引用:
VS2010

运行结果
3 6
3.5 2


有什么问题?
c=Complex(2.5)+a;/*这里改为c=2.5+a。。。。也能对吗?

[解决办法]
改成c=a+2.5;就好理解了吧。编译器会自动调用单参构造函数。
另外Complex operator + (Complex &a, Complex &b);内参数把引用符&去掉,我的 g++ 4.6.3 for fedora 16才能编译通过。
如果真按2楼分析的,那楼主应该再加个运算符吧,因为编译器的语法分析看到2.5的时候就认为它是double型,而这个型别是不能与Complex型直接相加的,也找不到用户定义的函数,所以出错。
C/C++ code
#include<iostream>using namespace std;class Complex{public:Complex();Complex(double i, double j);Complex(double r);friend Complex operator+(Complex a, Complex b);friend Complex operator+(double d, Complex b);void display();private:double m_a;double m_b;};int main(){Complex a(1,2);Complex b(2,4);Complex c;c=a+b;c.display();c=2.5+b;c.display();return 0;}Complex::Complex(){m_a=0;m_b=0;}Complex::Complex(double i, double j){m_a=i;m_b=j;}Complex::Complex(double r){m_a=r;m_b=0;}Complex operator+(Complex a, Complex b){return Complex(a.m_a+b.m_a,a.m_b+b.m_b);}void Complex::display(){cout<<m_a<<" "<<m_b<<endl;} Complex operator+(double d, Complex b){     return Complex(d+b.m_a, b.m_b);      } 

热点排行