C++学习--友元

C++的结构体和类均有私有和公有属性,其实在C++中,结构体和类没有很大的差别。私有属性只能在类的内部使用,但C++有提供了一个友元函数,可以在外部访问类的私有属性。友元的关键词是friend,即使朋友的意思,就好像朋友能进出你的家一样。

1.友元函数访问类或者结构体的属性

类的私有属性只能在类的内部访问,通过public属性构建的函数可以访问类的private属性,但友元函数也可以访问类的私有属性,其实这相当于把一个类当做参数传给了一个函数,然后访问了类。在操作符重载中,友元函数会频繁用到。结构体和类是一样的,类拥有的结构体均有,差别在于结构体默认是公有,类默认是私有。

#include<iostream>
class Person
{
private:
	int age;
	float height;
public:
	Person(int, float);//构造函数
	friend void get_info(Person &);//声明一个友元函数,参数是类的引用
};
Person::Person(int age, float height)
{
	this->age = age;
	this->height = height;
}
void get_info(Person &p)//一个外部函数
{
	std::cout << "age=" << p.age << "height=" << p.height << std::endl;
}
void main()
{
	Person p1(10, 163);
	get_info(p1);//实例化类后传进函数
	system("pause");
}

如果没有在类中声明为友元函数,即使把类当做参数传入函数也是不能访问类的属性的

void print(Person &p)//没有在类中声明为友元函数,不能访问类的私有属性
{
	std::cout << "age=" << p.age << "height=" << p.height << std::endl;
}

2.友元类

声明为友元类后可以可以访问朋友类的属性甚至可以修改,但友元是单向的。例如声明B是A的友元类,不是说A是B的友元类,并且友元类的关系不能传递。

#include<iostream>
class Person2;//需要先声明Person2
class Person
{
private:
	int age;
	float height;
public:
	Person(int, float);
	friend Person2;//声明为友元类
};
Person::Person(int age, float height)
{
	this->age = age;
	this->height = height;
}

class Person2
{
public:
	Person2(int ,int);
};
Person2::Person2(int a,int b)
{
	Person p(10, 163);//实例化一个Person类
	std::cout << p.age << p.height << std::endl;
	p.age = a;//访问并修改友元类的属性
	p.height = b;
}
void main()
{
	Person2 p(20, 166);//实例化一个Person2
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/weixin_40850689/article/details/83240732
今日推荐