构造函数

flysnowhite 2013-04-02 08:04:50
假设有一个类Date,已经定义了构造函数、拷贝构造函数、析构函数等。
在执行Date d[3]={Date(2011,1,1),Date(2012,2,2)};
后。执行了几次构造函数、几次拷贝构造函数、几次析构函数?
...全文
302 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghost5216 2013-04-05
  • 打赏
  • 举报
回复
引用 13 楼 snowwhite1 的回复:
或者换个简单的问题,临时对象什么时候需要调用构造函数,什么时候不需要? 比如:Date d=Date(2011,10,1);右边临时对象没有调用构造函数。 而Date d; d=Date(2011,10,1);这时临时对象调用了构造函数。有什么规律吗?
《C++ primer》第三版 类的初始化 569页 为构造函数指定实参有三种等价形式 // 一般等价的形式 Account acct1( "Anna Press" ); Account acct2 = Account( "Anna Press" ); Account acct3 = "Anna Press"; 568页“在内部编译器会重写我们的程序插入对构造函数的调用” 以下是我的理解: Date d=Date(2011,10,1);编译器分析之后认为这就是初始化而已。 “Date d; d=Date(2011,10,1);这时临时对象调用了构造函数。” Date d; 这时已经调用了构造函数。d=Date(2011,10,1);时不会再为d调用构造函数了,会由Date(2011,10,1)生成临时,然后调用赋值。
taodm 2013-04-03
  • 打赏
  • 举报
回复
没有规律! 编译器有优化或不优化的权力。 所以,唯一能依赖的是:不要写出依赖这个优化发生或不发生的代码。
flysnowhite 2013-04-03
  • 打赏
  • 举报
回复
或者换个简单的问题,临时对象什么时候需要调用构造函数,什么时候不需要? 比如:Date d=Date(2011,10,1);右边临时对象没有调用构造函数。 而Date d; d=Date(2011,10,1);这时临时对象调用了构造函数。有什么规律吗?
  • 打赏
  • 举报
回复
哪里需要对象,哪里就要有构造,哪里要删除对象,哪里就要析构。 拷贝构造的话,就几个特殊场合下需要宝贝构造。 看书,C++ Primer
lzjamao 2013-04-03
  • 打赏
  • 举报
回复
楼主,自己写程序运行下不就知道了。楼主好人,肯定来散分的! 接..........楼主好人楼主好人楼主好人楼主好人楼主好人楼主好人.
ghost5216 2013-04-02
  • 打赏
  • 举报
回复
引用 5 楼 snowwhite1 的回复:
程序我会编,我需要的是解释。
如果用C++就是这样规定的,或者说C++就是这样设计的来解释,估计无法满足楼主的求知欲。 我也很想知道是否有一个标准的答案或文献来解释。 我查了<<C++程序设计语言>><<C++primer>>,都是说可以这样做,而没有解释这个过程。 这个问题的核心是C++在数组初始化时是怎么设计的? <<C++语言的设计和演化>>第162页或许可以为这个问题提供一点思路。 我的理解就是数组初始化时,先分配整体空间,然后为每个元素“放置”(就是逐个调用构造函数) Date d[3];用默认构造函数来初始化。Date d[3]={Date(2011,1,1),Date(2012,2,2)};用带参数构造函数来初始化。 我认为可以相同的方式理解这两种形式。 至于符号={,},不过是一种语法形式,不要看到=就想到赋值。
flysnowhite 2013-04-02
  • 打赏
  • 举报
回复
这里有这样几个问题: 1、Date d[3];会调用三次缺省构造函数;而创建临时对象Date(2011,1,1)等也会调用构造函数。但两者放在一起却只调用了一次,为什么?程序进行优化了吗? 2、如果临时对象创建时调用了构造函数,则临时对象使用后会调用析构函数。 大家可以比较这两段代码: Date d[3]={Date(2011,1,1),Date(2012,2,2)}; 与 Date d[3]; d[0]=Date(2011,1,1);d[1]=Date(2012,2,2); 两者有什么差别?
ForestDB 2013-04-02
  • 打赏
  • 举报
回复
引用 3 楼 snowwhite1 的回复:
照我的理解,首先创建一个临时对象Date(2011,1,1),调用一次构造函数,然后用该对象为d[0]初始化,调用一次拷贝构造函数,再销毁临时对象Date(2011,1,1),调用一次析构函数;
这复杂的过程被优化掉了。
bleachyin1991 2013-04-02
  • 打赏
  • 举报
回复
引用 4 楼 ghost5216 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930#include "stdafx.h"#include <iostream>using namespace std;class Date{public: Date(int a,int b,int c):A(a), B(b), C(c) {……
就如你代码所写....三次构造 三次析构(两次带参构造一次默认构造) 啊...本人虽然小白,但也一眼看出来了...
lghe001 2013-04-02
  • 打赏
  • 举报
回复
Date d[3] 既然是定义,要求生成3个Data对象,因为对象生成时总是会要调用构造函数的(调哪个另说),所以一定至少是调了3次构造函数(说至少是因为有些构造函数还可以调另一个重载的构造函数),相应的析构函数自然也就调了3次。 至于调哪些构造函数,看你定义时的初始化,反正匹配就是了
flysnowhite 2013-04-02
  • 打赏
  • 举报
回复
程序我会编,我需要的是解释。
ghost5216 2013-04-02
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>
using namespace std;
class Date
{
public:
	Date(int a,int b,int c):A(a), B(b), C(c)
	{
		cout<<"参数构造"<<endl;
	};
	Date()
	{
		cout<<"默认构造"<<endl;
	};
	Date(Date& date)
	{
		A = date.A;B = date.B;C = date.C;
		cout<<"拷贝构造"<<endl;
	};
	~Date(){cout<<"析构"<<endl;};
	int A;
	int B;
	int C;
	
};
int _tmain(int argc, _TCHAR* argv[])
{
	Date d[3]={Date(2011,1,1),Date(2012,2,2)};
	return 0;
}
flysnowhite 2013-04-02
  • 打赏
  • 举报
回复
照我的理解,首先创建一个临时对象Date(2011,1,1),调用一次构造函数,然后用该对象为d[0]初始化,调用一次拷贝构造函数,再销毁临时对象Date(2011,1,1),调用一次析构函数;同理,创建一个临时对象Date(2012,2,2),调用一次构造函数,然后用该对象为d[1]初始化,调用一次拷贝构造函数,再销毁临时对象Date(2012,2,2),调用一次析构函数;最后用缺省构造函数初始化d[2].当三个对象生命周期结束时,执行三次析构函数。这样对吗?系统是不是进行了优化,使得临时对象的创建和销毁不再进行?
goback2008 2013-04-02
  • 打赏
  • 举报
回复
你定义了3个元素的Date对象数组,但是只初始化了2个,如果你没有提供不带参数的构造函数就会报错,这里不涉及返回Date对象也不涉及用旧类创建新类,故拷贝构造函数不会执行,所以执行3次构造函数(两次带参数的构造函数,一次不带参数的构造函数),三次析构函数
wahaha_1986 2013-04-02
  • 打赏
  • 举报
回复
单单执行Date d[3]={Date(2011,1,1),Date(2012,2,2)};这个语句,需要调用3次构造函数(2次带参数构造函数,一次无参默认构造函数);没有复制构造,不执行拷贝构造函数;只有当定义该数组的函数退出时,才执行3次析构函数。

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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