C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用)
函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项)
C++类和对象—封装(属性和行为作为整体,设计学生类,访问权限,class和struct的区别,成员属性私有化,设计案例(1立方体类,2点和圆的关系(多文件编程)))
C++类和对象—对象特征(构造函数与析构函数,函数的分类以及调用,拷贝构造函数调用时机,构造函数调用规则,深拷贝和浅拷贝,初始化列表,类对象作为类成员,静态成员)
C++对象模型和this指针(成员变量和成员函数分开存储,this指针的用途,空指针访问成员函数,const修饰成员函数)
C++类和对象-友元(全局函数做友元,友元类,成员函数做友元)
C++ 模板学习01(函数模版)(函数模板的语法、函数模板注意事项、函数模板案例-数组排序、普通函数与函数模板的区别、普通函数与函数模板的调用规则、模板的局限性)
C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
生活中你的家有客厅(rublic),有你的卧室(Private)
客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去但是呢,你也可以允许你的好闺蜜好基友进去。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类 访问另一个类中私有成员
友元的关键字为friend
友元的三种实现
全局函数做友元
类做友元
成员函数做友元
一.全局函数做友元
#include<iostream>
using namespace std;
#include<string>
class building
{
//全局函数goodgay是building的好朋友,可以访问building中的私有成员
friend void goodgay(building& building);
public:
building()
{
m_settingroom = "客厅";
m_bedroom = "卧室";
}
public:
string m_settingroom;
private:
string m_bedroom;
};
//全局函数
void goodgay(building &building)
{
cout << "好基友的全局函数,正在访问:" << building.m_settingroom << endl;
cout << "好基友的全局函数,正在访问:" << building.m_bedroom << endl;
}
int main()
{
building building;
goodgay(building);
system("pause");
}
二.类做友元
#include<iostream>
using namespace std;
#include<string>
class Building;
class goodgay
{
public:
void visit();//参观函数,访问building中的属性
goodgay();
private:
Building *building;
};
class Building
{
friend class goodgay;
public:
string m_settingroom;
private:
string m_bedroom;
public:
Building();
};
Building::Building()
{
m_settingroom = "客厅";
m_bedroom = "卧室";
}
goodgay::goodgay()
{
//创建一个建筑物对象
building = new Building;
}
void goodgay::visit()
{
cout << "好基友正在访问:" << building->m_bedroom << endl;
cout << "好基友正在访问:" << building->m_settingroom << endl;
}
void test1()
{
goodgay gg;
gg.visit();
}
int main()
{
test1();
system("pause");
}
三.成员函数做友元
友元不仅仅只是类和全局函数才能做,c++也提供具体到某一类中的成员函数作为友元函数进行访问
#include<iostream>
using namespace std;
#include<string>
class Building;
class goodgay
{
public:
void visit();//让visit函数可以访问Building中私有成员
void visit2();//让visit2函数不可以访问Building中私有成员
goodgay();
private:
Building *building;
};
class Building
{
friend void goodgay::visit();//告诉编译器 goodgay下的visit成员函数作为本类的好朋友 可以访问私有成员
public:
string m_settingroom;
private:
string m_bedroom;
public:
Building();
};
Building::Building()
{
m_settingroom = "客厅";
m_bedroom = "卧室";
}
goodgay::goodgay()
{
//创建一个建筑物对象
building = new Building;
}
void goodgay::visit()
{
cout << "好基友正在访问:" << building->m_bedroom << endl;
cout << "好基友正在访问:" << building->m_settingroom << endl;
}
void goodgay::visit2()
{
cout << "好基友正在访问:" << building->m_settingroom << endl;
}
void test1()
{
goodgay hh;
hh.visit();
hh.visit2();
}
int main()
{
test1();
system("pause");
}