C++友元
欢迎来观看温柔了岁月.c的博客 目前 设有C++学习专栏 C语言项目专栏 数据结构与算法专栏
目前主要更新C++学习专栏,C语言项目专栏不定时更新 待C++专栏完毕,会陆续更新C++项目专栏和数据结构与算法专栏
一周主要三更,星期三,星期五,星期天 感谢大家的支持
友元函数与友元类
- C++友元
-
- 什么是友元
- 友元函数
-
- 以另一个类的成员函数为友元(了解即可)
- 友元类
-
- 互为友元类(了解即可)
C++友元
什么是友元
- C++友元是用friend关键字修饰的函数或者类
2.友元的作用:用来打破类的封装(忽视权限的限定)
3.友元并不是说直接访问数据成员,友元只是提供一个场所,赋予对象具有打破权限限定的能力。
4.友元函数和友元类,不属于当前类,实现函数或者类不需要类名来限定
友元函数
#include<iostream>
#include<string>using namespace std;class MM
{
public:MM() = default; //允许存在无参的函数MM(int age, string name) :age(age), name(name) {}void printDate(){cout << "age = " << age << "name = " << name << endl;}friend void visitDate(MM& object); //友元函数 ,在类内用friend修饰private:int age;string name;};//可以类外实现,也可以类内实现,一般是类外实现
//类外实现不需要加类名进行限定,这也是与函数类外实现的区别
//注意任何数据的访问,都需要通过对象,友元只是赋予对象打破权限限定的权限
void visitDate(MM & object){cout << object.name << endl; //函数传参访问MM* pmm = new MM(10, " ni"); //new创建对象访问pmm->name = "ni";MM mm; // 默认构造构造无参函数访问mm.age = 10;MM mm(10, "温柔了岁月"); // 成员函数访问cout << mm.age << mm.name << endl; }int main()
{system("pause");return 0;
}
以另一个类的成员函数为友元(了解即可)
以类A的成员函数,在类B中实现友元
一般都不这样写,了解即可
#include<iostream>
#include<string>using namespace std;class A
{
public:void printA(A& object);private:int age;string name;
};class B
{
public:friend void A::printA(A& object); //加类名限定private:int age;string name;
};void A::printA(A& object)
{cout << object.age << endl;
}int main()
{system("pause");return 0;
}
友元类
用friend 修饰一个类
//友元类
#include<iostream>
#include<string>using namespace std;class boy
{
public:boy(string name, int age);friend class girl; //友元类
private:int age;string name;
};//在girl类中无视boy类中的权限,什么都可以访问
class girl
{
public:void printDate(boy& object){object.age = 10;cout << age << endl;}void printFate(boy & object){boy* p = new boy("ni", 19);cout << p->age << p->name << endl;}
private:int age;
};
int main()
{system("pause");return 0;
}
互为友元类(了解即可)
了解即可,一般不会这么写
//互为友元类#include<iostream>
#include<string>using namespace std;class A
{
public:friend class B;
private:int age;string name;
};class B
{
public:friend class A;
private:int age;string name;
};int main()
{system("pause");return 0;
}