1.友元函数
将普通函数声明为友元函数
该普通函数不属于类本身,仅在类中进行友元声明
声明方式:friend 类型名 函数名(参数列表)
该普通函数在类外声明(不是类体中的函数在类外声明)
声明中,不加类域限定符
普通函数声明: 类型名 函数名(参数列表)
类体函数类外声明:类型名 类名::函数名(参数列表)
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:
#include<iostream>
using namespace std;
class fun{
friend int f(fun &sqrt1);
private:
int width;
int lenth;
public:
int cin1(){
cin >> width >> lenth;
}
int getwidth(){
return width;
}
int getlenth(){
return lenth;
}
};
int f(fun &sqrt1){
int x,y;
x = sqrt1.width;
y = sqrt1.lenth;
return x*y;
}
int main(){
fun sqrt1;
sqrt1.cin1();
cout << f(sqrt1);
return 0;
}
友元函数可以直接使用类中的数据
2.友元类
一个类可以访问另一个类中的私有成员
friend class 类名;
#include<iostream>
#include<cstring>
using namespace std;
class building;
class GoodGay{
public:
GoodGay();
void visit();//此函数访问Building中的属性
building * Building;//创建一个指针,用来指向一个building类
};
class building{
public:
friend class GoodGay; //GoodGay是本类的友元类,可以访问私有成员
building();
string m_sittingroom; //客厅
private:
string m_bedroom; //卧室
};
building::building(){
m_sittingroom = "客厅";
m_bedroom = "卧室";
}
void GoodGay::visit(){
cout << "好基友类正在访问" << Building->m_sittingroom << endl;
cout << "好基友类正在访问" << Building->m_bedroom << endl;//此举执行成功的条件是GoodGay类是building类的友元类
}
GoodGay::GoodGay(){
//创建一个建筑物的对象
Building = new building; //开辟出一段内存给Building对象
}
void test01(){
GoodGay gg;
gg.visit();
}
int main(){
test01();
return 0;
}