C++学习笔记13,C++核心编程模板

20 篇文章 0 订阅
7 篇文章 0 订阅

友元 friend

友元的目的:让一个函数或一个类可以 访问另一个类中的 私有成员

友元的三种实现方式:

  1. 全局函数做友元
  2. 类做友元
  3. 成员函数做友元

1、全局函数做友元

class Building	//房屋类
{
	//声明 GoodGay()是 Building的 VIP,可以访问Building的私有属性(成员)
	friend void GoodGay(Building& B);
public:
	string b_SittingRoom;	//客厅
private:
	string b_BedRoom;		//卧室
public:
	Building()
	{
		b_SittingRoom = "客厅";
		b_BedRoom = "卧室";
	}
};

//全局函数
void GoodGay(Building &B)
{
	cout << "好基友全局函数正在访问:" << B.b_SittingRoom << endl;
	cout << "好基友全局函数正在访问:" << B.b_BedRoom << endl;
}

void test24()
{
	Building b1;
	GoodGay(b1);
}

int main30()
{
	test24();
	system("pause");
	return 0;
}

2、类做友元

class Building1;

class GoodGay1
{
public:
	Building1* building;

	void visit(); //参观函数,访问Building1中的属性
	GoodGay1();
};

class Building1
{
	//声明 GoodGay1类是 Building1的 VIP,可以访问Building1的私有属性(成员)
	friend class GoodGay1;

public:
	string b_SittingRoom;	//客厅
private:
	string b_BedRoom;		//卧室

public:
	Building1();
};

//类外写成员函数
Building1::Building1()
{
		b_SittingRoom = "客厅";
		b_BedRoom = "卧室";
}
GoodGay1::GoodGay1()
{
	building = new Building1;//创建建筑物对象
}
void GoodGay1::visit()
{
	cout << "好基友类正在访问:" << building->b_SittingRoom << endl;
	cout << "好基友类正在访问:" << building->b_BedRoom<< endl;
}

void test25()
{
	GoodGay1 g;
	g.visit();
}

int main31()
{
	test25();
	system("pause");
	return 0;
}

3、成员函数做友元

例一(会报错)

class GoodGay2;

class Building2
{
	friend void GoodGay2::visit1();
public:
	string SittingRoom;	//客厅
private:
	string BedRoom;		//卧室
public:
	Building2()
	{
		SittingRoom = "客厅";
		BedRoom = "卧室";
	}
};

class GoodGay2
{
private:
	Building2* building;
public:
	GoodGay2()
	{
		building = new Building2;
	}
	void visit1() //使其  可以访问Building2类中的私有成员
	{
		cout << "visit1 正在访问:" << building->SittingRoom << endl;
		cout << "visit1 正在访问:" << building->BedRoom << endl;
	}
	void visit2() //使其不可以访问Building2类中的私有成员
	{
		cout << "visit1 正在访问:" << building->SittingRoom << endl;
		//cout << "visit1 正在访问:" << building->BedRoom << endl;
	}
};

void test26()
{
	GoodGay2 g1;
	g1.visit1();
	g1.visit2();
}
int main32()
{
	test26();
	system("pause");
	return 0;
}

例二(没有问题)

class Building2;

class GoodGay2
{
private:
	Building2* building;
public:
	GoodGay2();
	void visit1();//使其  可以访问Building2类中的私有成员
	void visit2();//使其不可以访问Building2类中的私有成员
};

class Building2
{
	friend void GoodGay2::visit1();
public:
	string SittingRoom;	//客厅
private:
	string BedRoom;		//卧室
public:
	Building2()
	{
		SittingRoom = "客厅";
		BedRoom = "卧室";
	}
};

void GoodGay2::visit1()//使其  可以访问Building2类中的私有成员
{
	cout << "visit1 正在访问:" << building->SittingRoom << endl;
	cout << "visit1 正在访问:" << building->BedRoom << endl;
}
void GoodGay2::visit2()//使其不可以访问Building2类中的私有成员
{
	cout << "visit1 正在访问:" << building->SittingRoom << endl;
	//cout << "visit1 正在访问:" << building->BedRoom << endl;
}
GoodGay2::GoodGay2()
{
	building = new Building2;
}

void test26()
{
	GoodGay2 g1;
	g1.visit1();
	g1.visit2();
}

int main32()
{
	test26();
	system("pause");
	return 0;
}

问题:两种类的声明方式,为什么一种可以跑通,另一种却会报错?编译器逐行读代码的原因????????????(求指导)

我的老师给出如下解答
“前向声明(forward declaration),在声明之后、定义之前,声明的类是一个不完全类型(incomplete type),即已知是一个类型,但是不知道包含哪些成员”。“不完全类型只能以有限方式使用。不能定义该类型的对象。不完全类型只能使用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。”

(哔哩哔 哩黑马程序员 C++教程 学习笔记,如有侵权请联系删除)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值