关于友元和复制构造函数的调用
/* 类中的friend关键词指出,另一个类的特定函数或所有成员函数
*可以读写该类的私用数据成员.使得类得以保持私用实现,同时允许
*特定的类和函数有控制的访问该实现.
*/
#include<iostream>
//A forward reference. 前置引用,告诉编译器以后声明class Date.
//class Date; 为什么前置引用在Dev-C++中不能编译通过,而在VC6中可以?
class CustomDate{
int da,yr;
public:
CustomDate(int d=0,int y=0):da(d),yr(y)
{}
CustomDate(CustomDate& cd)
{
da=cd.da;
yr=cd.yr;
std::cout<<"调用CustomDate的复制构造函数"<<std::endl;
}
void display() const
{
std::cout<<yr<<'-'<<da<<std::endl;
}
//Allow Date member functions to
//see customDate private members.
friend class Date; //在 Dev-C++中前置引用不能通过编译,这种声明叫做显式友元前向引用(编译通过)
};
class Date{
int mo,da,yr;
public:
Date(int m=6,int d=20,int y=1984):mo(m),da(d),yr(y)
{}
operator CustomDate();
};
//Member conversion function (Date->CustomDate).
Date::operator CustomDate()
{
static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
CustomDate cd(0,yr);
for(int i=0;i<mo-1;i++)
cd.da+=dys[i]; //CustomDate的da是private数据成员,但是由于在CustomDate中
cd.da+=da; //声明了Date作为其友元,因此其私有成员在Date中可见。
std::cout<<"调用Date的成员转换函数"<<std::endl;
return cd;
}
int main()
{
Date dt(3,13,1984);
CustomDate cd;
cd=dt; //VC6中两次调用CustomDate的复制构造函数
cd.display(); //而在Dev-C++中不调用CustomDate的复制构造函数
system("Pause");
return 0;
}
问题1: 为什么前置引用在Dev-C++中不能编译通过,而在VC6中可以?
问题2: 为什么在在VC中两次调用CustomDate的复制构造函数,而在Dev-C++中一次也没有调用?