operator的问题
时间:2011-12-13
来源:互联网
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
A temp(x+r.x,y+r.y);//调用构造函数 c=temp;//调用复制构造函数
作者: shenxinji 发布时间: 2011-12-13
先执行a+b,调用的是成员函数operator+,return A(x+r.x,y+r.y)调用构造函数,并返回一个A对象。之后调用赋值函数,将这个返回的对象赋值给c。
另外,楼主没有写赋值函数,编译器会自己生成一个的,做法是位拷贝。
你可以自己实现一个赋值函数,并在其中打印信息,便会看到。
作者: mm11214014 发布时间: 2011-12-13
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
# 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
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<<"我是复制构造!"<……
作者: blase2234 发布时间: 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=o……
复制构造是拷贝构造吗?
----------
是的
作者: wing_0706 发布时间: 2011-12-13
我是构造!
我是构造!
我是构造!
我是构造!
x=40,y=60
根本没有调用复制构造函数啊
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<<"我是复制构造!……
作者: blase2234 发布时间: 2011-12-13
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28