构造函数假设有一个类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++就是这样设计的来解释,估计无法满足楼主的求知欲。
我也很想知道是否有一个标准的答案或文献来解释。
我查了<<C++程序设计语言>><<C++primer>>,都是说可以这样做,而没有解释这个过程。
这个问题的核心是C++在数组初始化时是怎么设计的?
<<C++语言的设计和演化>>第162页或许可以为这个问题提供一点思路。
我的理解就是数组初始化时,先分配整体空间,然后为每个元素“放置”(就是逐个调用构造函数)
Date d[3];用默认构造函数来初始化。Date d[3]={Date(2011,1,1),Date(2012,2,2)};用带参数构造函数来初始化。 我认为可以相同的方式理解这两种形式。
至于符号={,},不过是一种语法形式,不要看到=就想到赋值。
[解决办法]哪里需要对象,哪里就要有构造,哪里要删除对象,哪里就要析构。
拷贝构造的话,就几个特殊场合下需要宝贝构造。
看书,C++ Primer
[解决办法]楼主,自己写程序运行下不就知道了。楼主好人,肯定来散分的! 接..........楼主好人楼主好人楼主好人楼主好人楼主好人楼主好人.
[解决办法]没有规律!
编译器有优化或不优化的权力。
所以,唯一能依赖的是:不要写出依赖这个优化发生或不发生的代码。
[解决办法]《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)生成临时,然后调用赋值。