首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

构造函数解决方案

2013-04-12 
构造函数假设有一个类Date,已经定义了构造函数、拷贝构造函数、析构函数等。在执行Date d[3]{Date(2011,1,1)

构造函数
假设有一个类Date,已经定义了构造函数、拷贝构造函数、析构函数等。
在执行Date d[3]={Date(2011,1,1),Date(2012,2,2)};
后。执行了几次构造函数、几次拷贝构造函数、几次析构函数? 构造函数、析构函数
[解决办法]
单单执行Date d[3]={Date(2011,1,1),Date(2012,2,2)};这个语句,需要调用3次构造函数(2次带参数构造函数,一次无参默认构造函数);没有复制构造,不执行拷贝构造函数;只有当定义该数组的函数退出时,才执行3次析构函数。
[解决办法]
你定义了3个元素的Date对象数组,但是只初始化了2个,如果你没有提供不带参数的构造函数就会报错,这里不涉及返回Date对象也不涉及用旧类创建新类,故拷贝构造函数不会执行,所以执行3次构造函数(两次带参数的构造函数,一次不带参数的构造函数),三次析构函数
[解决办法]


#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;
}

[解决办法]
Date d[3]
既然是定义,要求生成3个Data对象,因为对象生成时总是会要调用构造函数的(调哪个另说),所以一定至少是调了3次构造函数(说至少是因为有些构造函数还可以调另一个重载的构造函数),相应的析构函数自然也就调了3次。
至于调哪些构造函数,看你定义时的初始化,反正匹配就是了
[解决办法]
引用:
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)    {……

就如你代码所写....三次构造 三次析构(两次带参构造一次默认构造) 啊...本人虽然小白,但也一眼看出来了...
[解决办法]
引用:
照我的理解,首先创建一个临时对象Date(2011,1,1),调用一次构造函数,然后用该对象为d[0]初始化,调用一次拷贝构造函数,再销毁临时对象Date(2011,1,1),调用一次析构函数;

这复杂的过程被优化掉了。

[解决办法]
引用:
程序我会编,我需要的是解释。


如果用C++就是这样规定的,或者说C++就是这样设计的来解释,估计无法满足楼主的求知欲。
我也很想知道是否有一个标准的答案或文献来解释。

我查了<<C++程序设计语言>><<C++primer>>,都是说可以这样做,而没有解释这个过程。

这个问题的核心是C++在数组初始化时是怎么设计的?
<<C++语言的设计和演化>>第162页或许可以为这个问题提供一点思路。

我的理解就是数组初始化时,先分配整体空间,然后为每个元素“放置”(就是逐个调用构造函数)

Date d[3];用默认构造函数来初始化。Date d[3]={Date(2011,1,1),Date(2012,2,2)};用带参数构造函数来初始化。 我认为可以相同的方式理解这两种形式。
至于符号={,},不过是一种语法形式,不要看到=就想到赋值。

[解决办法]
哪里需要对象,哪里就要有构造,哪里要删除对象,哪里就要析构。

拷贝构造的话,就几个特殊场合下需要宝贝构造。
看书,C++ Primer
[解决办法]
楼主,自己写程序运行下不就知道了。楼主好人,肯定来散分的! 接..........楼主好人楼主好人楼主好人楼主好人楼主好人楼主好人.
[解决办法]
没有规律!
编译器有优化或不优化的权力。
所以,唯一能依赖的是:不要写出依赖这个优化发生或不发生的代码。

[解决办法]

引用:

或者换个简单的问题,临时对象什么时候需要调用构造函数,什么时候不需要?
比如: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)生成临时,然后调用赋值。


热点排行