#include<iostream>
using namespace std;
class Time;
class data
{
public:
void display(Time &);
data(int y,int m,int d):year(y),month(m),day(d){}
~data(){}
private:
int year;
int month;
int day;
};
class Time
{
public:
void display();
Time(int h,int m,int s):hour(h),min(m),sec(s){};
~Time(){}
friend void data::display(Time&);
private:
int hour;
int min;
int sec;
};
void data::display(Time &p)
{
cout<<this->year<<' '<<this->month<<' '<<this->day<<' ';
cout<<p.hour<<' '<<p.min<<' '<<p.sec;
}
int main()
{
data a(1,2,3);
Time b(4,5,6);
a.display(b);
return 0;
}
可以看到我在第三行声明了Time类,因为在第七行和第十六行display函数用到了Time类,那如果我们把time拿到前面来呢?也不行,我们在Time中声明了data里的display是我们的友元函数,在第七行中我们声明了一个Time类对象的引用,那么我们是否可以直接定义一个对象呢?这是不可以的,在第七行,编译系统还不知道Time类是什么样的,不知道给对象分配多大的存储空间,所以就无法定义一个对象了,而引用和指针变量与它所指向的对象的大小是无关的。
解释一下引用:关于引用的性质。如果在程序中声明了变量b是变量a的引用,实际上在内存中为b开辟了一个指针型的储存单元,在其中存放a的地址输出引用b时,就输出b所指向的a的值,相当于输出*b引用其实就是一个指针常量,但是他的指向不能改变,所以,引用的本质还是指针哦,只是为了方便用户,C++才引入引用。
下面是换成指针,其实本质一样
#include<iostream>
using namespace std;
class Time;
class data
{
public:
void display(Time *);
data(int y,int m,int d):year(y),month(m),day(d){}
~data(){}
private:
int year;
int month;
int day;
};
class Time
{
public:
void display();
Time(int h,int m,int s):hour(h),min(m),sec(s){};
~Time(){}
friend void data::display(Time*);
private:
int hour;
int min;
int sec;
};
void data::display(Time *p)
{
cout<<this->year<<' '<<this->month<<' '<<this->day<<' ';
cout<<p->hour<<' '<<p->min<<' '<<p->sec;
}
int main()
{
data a(1,2,3);
Time b(4,5,6);
a.display(&b);
return 0;
}
再来一串代码:
#include<iostream>
using namespace std;
class Time;
class data
{
public:
void display(Time &);
data(int y,int m,int d):year(y),month(m),day(d){}
~data(){}
private:
int year;
int month;
int day;
};
void data::display(Time &p)
{
cout<<this->year<<' '<<this->month<<' '<<this->day<<' ';
cout<<p.hour<<' '<<p.min<<' '<<p.sec;
}
class Time
{
public:
void display();
Time(int h,int m,int s):hour(h),min(m),sec(s){};
~Time(){}
friend void data::display(Time&);
private:
int hour;
int min;
int sec;
};
int main()
{
data a(1,2,3);
Time b(4,5,6);
a.display(b);
return 0;
}
可以看出我把函数定义提前了,但是编译出错了,因为我只是声明了有Time这个函数,而并没有定义它,内存中不存在Time类型,所以编译器遇到p.hour等的时候就报错了。
另外友元函数最好放在类的所有public和private之后