# 友元普通函数
## 声明
friend 类型 函数名();
## 特点
可以突破类的封装,访问类中的数据成员
## 例子
~~~
#include <iostream>
using namespace std;
class Time
{
public:
Time(int,int,int);
friend void display(Time &);
//声明display函数为Time类的友元函数
private: //以下数据是私有数据成员
int hour;
int minute;
int sec;
};
Time∷Time(int h,int m,int s)
//构造函数,给hour,minute,sec赋初值
{
hour=h;
minute=m;
sec=s;
}
void display(Time& t)
//这是友元函数,形参t是Time类对象的引用
{
cout<<t.hour<<″:″<<t.minute
<<″:″<<t.sec<<endl;
}
int main( )
{
Time t1(10,13,56);
display(t1);
return 0; //调用display函数,实参t1是Time类对象
}
/****
结果:10:13:56
****/
~~~
# 友元成员函数
在一个类中,将另一个类中的成员函数声明为友元成员函数,这个函数可访问两个类中的所有数据成员
## 例子
~~~
#include <iostream>
using namespace std;
class Date; //对Date类的提前引用声明
class Time //定义Time类
{
public:
Time(int,int,int);
void display(Date &);
//display是成员函数,形参是Date类对象的引用
private:
int hour;
int minute;
int sec;
};
class Date //声明Date类
{
public:
Date(int,int,int);
friend void Time∷display(Date &);
//声明Time类display函数为Date类的友元成员函数
private:
int month;
int day;
int year;
};
Time∷Time(int h,int m,int s)//类Time的构造函数
{
hour=h;
minute=m;
sec=s;
}
void Time∷display(Date &d)
//display的作用是输出年、月、日和时、分、秒
{
cout<<d.month<<″/″<<d.day<<″/″
<<d.year<<endl;//引用Date类对象中的私有数据
cout<<hour<<″:″<<minute<<″:″
<<sec<<endl; //引用本类对象中的私有数据
}
Date∷Date(int m,int d,int y) //类Date的构造函数
{
month=m;
day=d;
year=y;
}
int main( )
{
Time t1(10,13,56); //定义Time类对象t1
Date d1(12,25,2004); //定义Date类对象d1
t1.display(d1);
//调用t1中的display函数,实参是Date类对象d1
return 0;
}
~~~
# 友元类
## 声明
在一个类中将另一个类声明为友元
格式:friend 类名;
## 特点
* 友元关系是单向的
* 友元关系不能传递
- 介绍
- 编程设计语言
- 第一章 对C++的初步认识
- 1.2 最简单的C++程序
- 1.3 C++对C的补充
- 1.3.1 return
- 1.3.2 输入输出流
- 1.3.3 putchar 和 getchar
- 1.3.4 用const定义常变量
- 1.3.5 函数原型声明
- 1.3.6 内置函数
- 1.3.7 函数重载
- 1.3.8 函数模板
- 1.3.9 有默认值的参数
- 1.3.10 作用域
- 1.3.11 const修饰指针
- 1.3.12 引用
- 1.3.13 生命期
- 1.3.14 变量
- 1.3.15 字符串变量
- 第二章 类与对象
- 2.2 类的声明和对象的定义
- 2.3 类的成员函数
- 第三章 关于类和对象的进一步讨论
- 3.1 构造函数
- 3.1.1 对象的初始化
- 3.1.2 构造函数
- 3.2 析构函数
- 3.3调用析构函数和构造函数的顺序
- 3.4 对象数组
- 3.5 对象指针
- 3.6 共享数据的保护
- 3.7 对象的建立与释放
- 3.8 对象的赋值与复制
- 3.9 静态成员
- 3.10 友元
- 3.11 类模板
- 第四章 运算符重载
- 数据类型转换
- 运算符重载
- 重载流插入运算符和流提取运算符
- 第五章 继承与派生
- 继承与派生
- 第六章 多态性与虚函数
- 多态性
- 虚函数
- 纯虚函数与抽象类