关于友元函数

#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之后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值