标题:一个关于构造函数的调用问题
只看楼主
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
 问题点数:0 回复次数:7 
一个关于构造函数的调用问题

下面的程序我真是搞不清楚了。在创建对象ob1(1,2,3)时,它是怎么调用下面这三条语句的呢?

three_d(){x=y=z=0;}
three_d(int i,int j,int k) {x=i;y=j;z=k;}
three_d operator(){(int a,int b,int c);

创建ob2时又是怎么调用的呢?构造函数调用的是有参的还是无参的呢?同时它又是怎么调用operator()的???我就是弄不清楚,还望大家多多指教,谢谢!!!

#include <iostream>
using namespace std;
class three_d{
int x,y,z;
public:
three_d(){x=y=z=0;} // ????
three_d(int i,int j,int k) {x=i;y=j;z=k;}//?????
three_d operator(){(int a,int b,int c);
void show();};
three_d three_d::operator()(int a,int b,int c)
{
three_d temp;
temp.x=x+a;
temp.y=y+b;
temp.z=z+c;
return temp;

}
void three_d::show()
{
cout<<x<<" ,";
cout<<y<<" ,";
cout<<z<<" \n";
}
int main()
{
three_d ob1(1,2,3),ob2;//创建对象ob2时有没有调用three_d(){x=y=z=0;} ??
ob2=ob1(10,11,12);
cout<<"ob1:";
ob1.show();
cout<<"ob2:";
cout<<ob2.show();
return 0;
}
}

结果:ob1:1,2,3
ob2:11,13,15

搜索更多相关主题的帖子: 构造函数 int three operator using 
2006-05-15 21:04
giant
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2005-12-11
得分:0 

你上面有点错
在创建对象ob1(1,2,3)时,它是怎么调用下面这三条语句的呢?
----------
是调用three_d(int i,int j,int k) {x=i;y=j;z=k;}
创建ob2时又是怎么调用的呢?构造函数调用的是有参的还是无参的呢?
---------
调用three_d(){x=y=z=0;} 刚开始定义时候是无参的
同时它又是怎么调用operator()的???
-------------
这一句ob2=ob1(10,11,12); 先调用three_d::operator()(int a,int b,int c) ,再调用系统自动生成的拷贝函数(three_d & operator=(const three_d & ob)),
你可以里面加一些语句就能清楚对象的创建过成
#include <iostream>
using namespace std;
class three_d
{
int x,y,z;
public:
three_d()
{
cout<<"three_d()"<<endl;
x=y=z=0;
}
three_d(int i,int j,int k)
{
cout<<"three_d(int i,int j,int k)"<<endl;
x=i;y=j;z=k;
}
three_d operator()(int a,int b,int c);
void show();
/*three_d & operator=(const three_d & ob)//这个就是上面说的系统自动生成的拷贝函数(three_d & operator=(const three_d & ob)),

{
cout<<"operator=()"<<endl;
x = ob.x;
y = ob.y;
z = ob.z;
return *this;
}*/
};
three_d three_d::operator()(int a,int b,int c)
{
cout<<"operator()"<<endl;
three_d temp;
temp.x=x+a;
temp.y=y+b;
temp.z=z+c;
return temp;

}
void three_d::show()
{
cout<<x<<" ,";
cout<<y<<" ,";
cout<<z<<" \n";
}
int main()
{
three_d ob1(1,2,3),ob2;//创建对象ob2时有没有调用three_d(){x=y=z=0;} ?? 有
ob2=ob1(10,11,12);
cout<<"ob1:";
ob1.show();
cout<<"ob2:";
ob2.show();
return 0;
}



2006-05-15 21:31
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
得分:0 
在创建对象ob1(1,2,3)时,它是怎么调用下面这三条语句的呢?
----------
是调用three_d(int i,int j,int k) {x=i;y=j;z=k;}
创建ob2时又是怎么调用的呢?构造函数调用的是有参的还是无参的呢?


创建对象ob1(1,2,3)时,它是为什么只调用three_d(int i,int j,int k) {x=i;y=j;z=k;} ,而没有调用operator()?
还有什么叫系统自动生成的拷贝函数啊,它起什么作用呢?

我是小小登山者!
2006-05-15 21:41
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
得分:0 
是不是在创建对象时,只能自动的去调用构造函数啊,运算的时候才能调用运算符重载啊!!

我是小小登山者!
2006-05-15 21:44
giant
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2005-12-11
得分:0 
在创建对象时编译器会跟根据对象含的实参类型和个数去选择最匹配的构造函数,运算的时候就调用运算符重载

2006-05-15 21:55
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
得分:0 
哦,我明白了,真的是非常感谢你!多日来我解不开的地方都被你点化开了,你真的是很了不起!!谢谢

我是小小登山者!
2006-05-15 21:59
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
以下是引用yanglinayp在2006-5-15 21:44:00的发言:
是不是在创建对象时,只能自动的去调用构造函数啊,运算的时候才能调用运算符重载啊!!

恩。这里的three_d ob1(1,2,3);是一个函数,你认为是运算符函数还是构造函数呢?
显然是构造函数,毕竟没有构造的东西,世界上就不存在,怎么对这个对象调用成员函数呢?


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-15 22:40
yanglinayp
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-3-21
得分:0 
谢谢

我是小小登山者!
2006-05-16 20:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-64484-1-1.html




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

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