有关构造函数的问题

wyylbl 2002-04-27 09:58:53
class date
{public:
date(){month=day=year=0;
cout<<"default constructor called.\n";}
date(int m,int d,int y)
{month=m;day=d;year=y;
cout<<"constructor called.\n";}
date(date &p)
{month=p.month;day=p.day;year=p.year;
cout<<"copy\n";}
~date()
{cout<<"destructor called.\n";}
void print() {cout<<"month="<<month<<",day="<<day<<",year="<<year<<endl;}
private:
int month,day,year;
};
void main()
{date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
dates[3]=date(7,25,1998);
dates[4]=date(7,26,1998);
for(int i=0;i<5;i++)
dates[i].print();
}

其中
date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
里的date(7,22,1998)怎么理解?是调用构造函数吗?但是构造函数是系统自动调用,不允许程序员调用的,这究竟是怎么回事?请各位帮帮忙!


...全文
101 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanpeng79 2002-04-29
  • 打赏
  • 举报
回复
学习
wangran 2002-04-28
  • 打赏
  • 举报
回复
大家执行一下不就行了,这次没时间了,下次我把答案显示出来!
cstpjl 2002-04-28
  • 打赏
  • 举报
回复
就是调用构造函数,它的构造函数是重载了的,调用的是第二个。
wyylbl 2002-04-28
  • 打赏
  • 举报
回复
to jinfeng-wang

dates[3] = date(7, 25, 1998);
创建一个匿名对象,Construct being called here! 是对的!
但是不调用CopyConstructor!只是把匿名对象的值赋给dates[3]

wyylbl 2002-04-28
  • 打赏
  • 举报
回复
to蝗虫

class A
{ int i;
public:
A(int _i):i(_i){cout<<"constructor called.\n";}
A(A &a){i=a.i;cout<<"copy constructor called.\n";}
~A(){cout<<"destructor called.\n";}
void print(){cout<<i<<endl;}
};
void main()
{A a=A(9); //没有创建匿名对象,初始化时不建临时对象
a.print();
}
输出结果
constructor called.//调用构造函数初始化a
9
destructor called.//调用析构函数释放a
alula 2002-04-28
  • 打赏
  • 举报
回复
to xiaoyan0206(我想回家)

dates[3] = date(7, 25, 1998);
有没有创建匿名对象,应该看dates[3]、dates[4]是否已经初始化。
如果未初始化,不需要创建匿名对象。
wyylbl 2002-04-28
  • 打赏
  • 举报
回复
多谢各位的指教!受益匪浅!
我想结帖,可是不会,请再次指教! :)
uf65 2002-04-28
  • 打赏
  • 举报
回复
class date
{public:
date(){month=day=year=0;
cout<<"default constructor called.\n";}
date(int m,int d,int y)
{month=m;day=d;year=y;
cout<<"constructor called.\n";}
date(date &p)
{month=p.month;day=p.day;year=p.year;
cout<<"copy\n";}
~date()
{cout<<"destructor called.\n";}
void print() {cout<<"month="<<month<<",day="<<day<<",year="<<year<<endl;}
private:
int month,day,year;
};
void main()
{date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
dates[3]=date(7,25,1998);
dates[4]=date(7,26,1998);
for(int i=0;i<5;i++)
dates[i].print();
}

其中
date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
里的date(7,22,1998)怎么理解?是调用构造函数吗?但是构造函数是系统自动调用,不允许程序员调用的,这究竟是怎么回事?请各位帮帮忙!
********************************************************************
// date(int m,int d,int y) this constructor was called three times
// for dates[0], dates[1] and dates[2],
//date() was called twice for dates[3] and dates[4].
date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};

*********************************************************
//here constructor was called for date(7,25,1998) -- a nameless
//temporary and followed by an assignment to dates[3].
// that temporary will be destroyed (destructor called)
// after the semicolon.

dates[3]=date(7,25,1998);
dates[4]=date(7,26,1998);

zerolinux 2002-04-28
  • 打赏
  • 举报
回复
你的代码我无法编译通过,我用的是Dev-C++4.0.
date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
就是这里无法通过编译,请指教。

举个简单的例子:
class A{
int i;
public:
A(int _i):i(_i){}
};

A a=A(9); // 这里并不是调用构造函数。
// 编译器先创建一个临时对象(匿名对象),
// 再将这一临时对象赋给对象a;
xiaoyan0206 2002-04-27
  • 打赏
  • 举报
回复
to wyylbl(清木子)
应是先建立一个匿名对象,然后调用date(date &p),拷贝构造函数
wyylbl 2002-04-27
  • 打赏
  • 举报
回复
to yzisyz
我对你的观点很感兴趣,但是我试过了,在
date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
条初始化语句里没有借助任何的中间对象,不建匿名对象,因为没有调用拷贝构造函数和析构函数
在下面两条赋值语句里建了匿名对象,调用了构造和析构函数
dates[3]=date(7,25,1998);
dates[4]=date(7,26,1998);
wyylbl 2002-04-27
  • 打赏
  • 举报
回复
好多书上都明确提出,程序中不能直接调用构造函数
???
yzisyz 2002-04-27
  • 打赏
  • 举报
回复
这里的 date(7,22,1998)是定义了一个无名对象,即用类 date 定义了一个属性为 month=7 day=22 year=1998 ,的对象,但这个对象没有自己的名字。

语句 date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};是指使用date(7,22,1998),date(7,23,1998),date(7,24,1998)这三个无名对象来初始化 date[5] 这个对象数组的前三个单元,这期间不但要调用构造函数,还要调用拷贝构造函数 date(date &p) ,初始化完成后,三个无名对象被销毁,所占用的内存空间被释放。
fangrk 2002-04-27
  • 打赏
  • 举报
回复
class date
{public:
date(){month=day=year=0;
cout<<"default constructor called.\n";}
date(int m,int d,int y)
{month=m;day=d;year=y;
cout<<"constructor called.\n";}
date(date &p)
{month=p.month;day=p.day;year=p.year;
cout<<"copy\n";}
~date()
{cout<<"destructor called.\n";}
void print() {cout<<"month="<<month<<",day="<<day<<",year="<<year<<endl;}
private:
int month,day,year;
};
void main()
{date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
dates[3]=date(7,25,1998);
dates[4]=date(7,26,1998);
for(int i=0;i<5;i++)
dates[i].print();
}

其中
date dates[5]={date(7,22,1998),date(7,23,1998),date(7,24,1998)};
里的date(7,22,1998)怎么理解?是调用构造函数吗?但是构造函数是系统自动调用,不允许程序员调用的,这究竟是怎么回事?请各位帮帮忙!

date dates[5]调用的是构造函数,构造了dates[0]---dates[4]五个date class object
程序员在声明一个class object的时候系统根据参数自动调用。
晨星 2002-04-27
  • 打赏
  • 举报
回复
只是当你不用任何参数声明一个对象时,系统自动为你调用无参构造函数。
晨星 2002-04-27
  • 打赏
  • 举报
回复
说构造函数不允许程序员调用是错误的,C/C++语言里没有什么函数不允许程序员调用,包括main函数。
youyouaq 2002-04-27
  • 打赏
  • 举报
回复
没看到有三个构造函数吗?

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧