C++构造函数不能重载的问题

月光散落 发布于 2016/05/01 11:33
阅读 407
收藏 0
        #include <iostream>
using namespace std;


class Complex;
Complex operator+(Complex&,Complex&);


class Complex{
public:
    Complex(Complex &c){ real=c.real; virt=c.virt; } //复制构造函数 
Complex(double r=0, double v=0){ real=r; virt=v; }  
Complex Add(Complex&);  //相加 
void Display();  //显示 
friend Complex operator+(Complex&,Complex&); //+重载友元函数 
private:
double real;
double virt;
};
Complex Complex::Add(Complex &b){
    double dr = this->real+b.real;
    double dv = this->virt+b.virt;
  Complex temp(dr,dv);   //这样return 就是对的 
  return temp;
}
Complex operator+(Complex& a,Complex& b)
{
double a1 = a.real+b.real;
double b2 = a.virt+b.virt;

  return Complex(a1,b2);  

//这样return 就错了 ,显示[Error] no matching function for call to 'Complex::Complex(Complex)'

//当我把 {Complex(Complex &c){ real=c.real; virt=c.virt; } //复制构造函数 }注释后,程序就正常了,

//这就显示出了:构造时值调用了复制构造函数,没有调用Complex(double r=0, double v=0){ real=r; //virt=v; },即没有重载???????  

}

void Complex::Display(){
cout <<real <<"+" <<virt <<"i\n";
}
int main()
{
double r1,v1,r2,v2;
cin>>r1>>v1;
cin>>r2>>v2;
Complex a(r1,v1), b(r2,v2), c(a);
    cout<<"复数a为:"; a.Display();
    cout<<"复数b为:"; b.Display();
    cout<<"复数b为:"; c.Display();
}
加载中
0
木兰宿莽
木兰宿莽

你研究复制构造函数是那样写的吗?

写成下面的形式:

Complex(const Complex& c){
  *this=c;
}



月光散落
月光散落
参数加上const后,就可以了,多谢
0
xpbob
xpbob
不是啊,其实你return的时候是两个工作,第一个是新建对象,走的是你写的构造函数,然后第二个是你return后的结果要直接给另一个对象,此时调用的是你的拷贝构造函数。出错时说拷贝的这个过程错了。
0
xpbob
xpbob
你可以把参数写成const Complex& c试试
月光散落
月光散落
加上const就对了,多谢了
0
s
sw55555
vc可以编译通过,但是g++不行,return的过程应该是你先用Complex::Complex(double r=0, double v=0)构造了一个临时对象,然后调用拷贝构造函数,拷贝临时对象到返回值,但是没有明确的到Complex&转换,需要把拷贝构造函数改为Complex(const Complex &c), 临时对象也可以隐式转换为const Complex &
s
sw55555
你可以查一查临时对象的具体生命周期,比如http://en.cppreference.com/w/cpp/language/lifetime
s
sw55555
查了一下没有找到为什么临时变量能绑定到常引用的具体原因,可以先说说我的理解吧,临时变量绑定到非常引用上是不安全的,因为使用引用时(尤其是写操作),临时变量的生命周期可能已经结束,但是绑定到常引用的临时本地变量,生命周期会相应的延长(具体你可以写代码测试一下,这个应该是C++标准规定的)。所以编译器允许默认绑定临时对象到常引用上,而不允许默认绑定到非常引用。
月光散落
月光散落
构造的临时对象是个常对象,所以拷贝构造函数中的参数要是个常引用类型,是这样吗?
返回顶部
顶部