C++友元类重载和友元函数重载
一、友元类和函数
1.概念
友元是c++独有特性,设置了友元函数或者友元类后,可以访问对应类的私有或保护成员
2.友元特点
1.优点 : 可以在对应友元后的函数中访问类里面的所有成员属性或成员方法(public,protected,private)
适当的提高了程序的运行效率
2.缺点 : 破坏类的封装性,违背面向对象思想
## 3.友元函数定义
friend 成员方法
friend void show();
4.友元函数使用
1.声明友元接口,此接口可以放在类里面任意位置声明
class Data
{
public:
Data(int a) : age(a){}
private:
int age;
void print();
// 声明函数为友元
friend void show();
};
2.友元函数类外实现
因为友元函数不属于类成员函数,没有this指针,所以类外实现不需要添加从属符(:😃,可以访问类的所有成员
// show是全局函数所以不需要声明
void show()
{
Data d(10);
cout << d.age << endl;
d.print();
this->age =
}
int main()
{
Data d(10);
// 友元函数
show();
}
//----------------------------------
3.友元函数类内实现,实现的时候也是需要创建类对象的
class Data
{
public:
Data(int a) : age(a){}
private:
int age;
void print();
// 声明函数为友元
friend void show()
{
Data d(10); //创建类对象
cout << d.age << endl;
d.print();
}
};
//注意使用的时候需要类外声明
void show();
//-----------------------
int main()
{
// 友元函数
show();
}
#include <iostream>
#include <math.h>
using namespace std;
class Point; //Calc要用Point 的对象,必须前向声明才可以找到对象
class Calc
{
public:
void mc_distance(Point &a, Point &b); //函数声明
private:
};
class Point
{
public:
Point(int a, int b):x(a), y(b)
{
}
private:
friend void Calc::mc_distance(Point &a, Point &b); //定义Calc的函数为友元函数
int x;
int y;
//friend class Calc; //第一种:友元类声明,这样Calc类可以访问Point的所有方法和属性
};
void Calc::mc_distance(Point &a, Point &b) //即是Calc的成员函数,也是友元函数
{
double dt= sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
cout<<"两点之间的距离:"<<dt<<endl;
}
int main(void)
{
Point a(1,2);
Point b(2,4);
Calc st;
st.mc_distance(a,b);
}
结果
PS C:\Users\newuser\Desktop\C++\第八天C++> g++ .\Y友元类.cpp -o man
PS C:\Users\newuser\Desktop\C++\第八天C++> ./man
两点之间的距离:2.23607
二、.友元类
将一个类设置另一个类的友元,格式:
class A
{
private:
int age;
// 将B设置A的友元
friend class B;
}
class B
{
}
友元类总结
友元是单向的,比如将A类声明为B类的友元类,那么A类可以访问B类的所有成员
但是,B类不能访问A类的私有或保护成员
设置为友元类后,此类任意方法可以访问另一个类的所有属性
//--------------------
例子:
class A
{
public:
void showA(B& b)
{
b.age = 20;
cout << b.age << endl;
}
private:
int age;
// 将B类设置为友元类,这样B里面的成员就可以访问A里面的私有方法或者私有属性
// 友元类声明,已经声明了B类
friend class B;
};
class B
{
public:
void showB(A &a)
{
a.age = 10;
cout << a.age << endl;
}
int a;
private:
int age;
// 将A类设置为友元类,这样A里面的成员就可以访问B里面的私有方法或者私有属性
friend class A;
};
int main()
{
A a;
B b;
b.showB(a);