+ -
当前位置:首页 → 问答吧 → operator的问题

operator的问题

时间:2011-12-13

来源:互联网

# include <iostream.h>
class A
{ int x,y;
public:
A(int i=1,int j=2):x(i),y(j){}
void print(){cout<<"x="<<x<<",y="<<y<<endl;}
A operator+(const A& r){ return A(x+r.x,y+r.y); }
};
A add(A m, A n)
{ A k; k.x=m.x+n.x; k.y=m.y+n.y;
return k;
}
void main()
{ A a(10,20), b(30,40), c;
c=a+b; //加法运算符“+”的重载
c.print();
}
问题在这里
A operator+(const A& r){ return A(x+r.x,y+r.y); }
return后面A(x+r.x,y+r.y),调用构造函数,但是没有生产具体类实例,这时候c=a+b;这里的a+b调用了operator+。那么是什么东西赋值给了对象c啊?

作者: blase2234   发布时间: 2011-12-13

C/C++ code

A temp(x+r.x,y+r.y);//调用构造函数
c=temp;//调用复制构造函数

作者: shenxinji   发布时间: 2011-12-13

c = a + b; 
先执行a+b,调用的是成员函数operator+,return A(x+r.x,y+r.y)调用构造函数,并返回一个A对象。之后调用赋值函数,将这个返回的对象赋值给c。
另外,楼主没有写赋值函数,编译器会自己生成一个的,做法是位拷贝。
你可以自己实现一个赋值函数,并在其中打印信息,便会看到。

作者: mm11214014   发布时间: 2011-12-13

返回一个A对象,但是没有定义A对象啊,请教
引用 2 楼 mm11214014 的回复:
c = a + b;
先执行a+b,调用的是成员函数operator+,return A(x+r.x,y+r.y)调用构造函数,并返回一个A对象。之后调用赋值函数,将这个返回的对象赋值给c。
另外,楼主没有写赋值函数,编译器会自己生成一个的,做法是位拷贝。
你可以自己实现一个赋值函数,并在其中打印信息,便会看到。

作者: blase2234   发布时间: 2011-12-13

返回了一个匿名的对象

作者: pengzhixi   发布时间: 2011-12-13

返回的是临时对象,没有名字的,或者说是编译器会产生一个临时对象,名字它会自己取

作者: riyueming184   发布时间: 2011-12-13

C/C++ code

# include <iostream>
using namespace std;
class A
{ 
    int x,y;
public:
    A(int i=1,int j=2):x(i),y(j){cout<<"我是构造!"<<endl;}
    A(A &one){x=one.x;y=one.y;cout<<"我是复制构造!"<<endl;}
    void print(){cout<<"x="<<x<<",y="<<y<<endl;}
    A operator+(const A& r){ return A(x+r.x,y+r.y); }
};
/*A add(A m, A n)
{ 
    A k; 
    k.x=m.x+n.x; 
    k.y=m.y+n.y;
    return k;
}*/
void main()
{ 
    A a(10,20), b(30,40), c;
    c=a+b; //加法运算符“+”的重载
    c.print();
}



从结果可以看出一共调用了4次构造函数和一次复制构造函数

作者: shenxinji   发布时间: 2011-12-13

复制构造是拷贝构造吗?
引用 6 楼 shenxinji 的回复:
C/C++ code

# include <iostream>
using namespace std;
class A
{
int x,y;
public:
A(int i=1,int j=2):x(i),y(j){cout<<"我是构造!"<<endl;}
A(A &amp;one){x=one.x;y=one.y;cout<<"我是复制构造!"<……

作者: blase2234   发布时间: 2011-12-13

引用 7 楼 blase2234 的回复:
复制构造是拷贝构造吗?

引用 6 楼 shenxinji 的回复:
C/C++ code

# include <iostream>
using namespace std;
class A
{
int x,y;
public:
A(int i=1,int j=2):x(i),y(j){cout<<"我是构造!"<<endl;}
A(A &amp;amp;one){x=o……


复制构造是拷贝构造吗?
----------
是的

作者: wing_0706   发布时间: 2011-12-13

我运行了,输出结果是:
我是构造!
我是构造!
我是构造!
我是构造!
x=40,y=60

根本没有调用复制构造函数啊

引用 6 楼 shenxinji 的回复:
C/C++ code


# include <iostream>
using namespace std;
class A
{
int x,y;
public:
A(int i=1,int j=2):x(i),y(j){cout<<"我是构造!"<<endl;}
A(A &amp;one){x=one.x;y=one.y;cout<<"我是复制构造!……

作者: blase2234   发布时间: 2011-12-13