1. 程式人生 > >C++學習--友元

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");
}