在类中将普通的函数声明为友元函数,即可以使用该友元函数对类中的私有成员进行访问

#include <iostream>using namespace std;class Time{
public:Time(int,int,int);friend void display(Time &);
private:int  hour;int  minute;int sec;};
Time::Time(int h, int m, int s) {    //定义一个构造函数并对构造函数hour=h;minute=m;sec=s;}
void display(Time &a)
{cout<<a.hour<<":"<<a.minute<<":"<<a.sec<<endl;}int main()
{Time t1(10,13,56);display(t1);    //display函数可以使用对象成员中的私有数据成员return 0;
}
**/home/andrew/文档/Clion/untitled5/cmake-build-debug/untitled5
10:13:56Process finished with exit code 0
**

将另一个类中的成员函数声明为友元函数

**#include <iostream>using namespace std;
class Date;  //对Date类进行提前声明
class Time{
public:Time(int,int,int);void display(Date &);
private:int  hour;int  minute;int sec;};
class Date{
public:Date(int,int,int);friend void Time::display(Date &);    //声明Time类中的display函数为本类中的友元函数
private:int month;int day;int year;};
Time::Time(int h, int m, int s) {    //定义一个构造函数并对构造函数hour=h;minute=m;sec=s;}
void Time::display(Date &d) {cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;    //Time中的成员函数引用Date类中的私有成员数据cout<<hour<<":"<<minute<<":"<<sec<<endl;}
Date::Date(int m, int d, int y) {month=m;day=d;year=y;}
int main()
{Time t1(10,13,56);Date d1(12,25,2004);t1.display(d1);return 0;
}**

类可以提前声明,但是必须在正式定义之后才能够使用类进行定义,类的对象。

**#include <iostream>using namespace std;
class Date;  //对Date类进行提前声明,虽进行了提前声明,但是类只有在进行了定义之后才能够使用
//Date t3(10,12,15);    //声明之后直接使用类,编译出错,因为类可以提前声明,但是作用范围有限,类只有正式定义之后才能够使用类去定义一个类型
class Time{
public:Time(int,int,int);void display(Date &);
private:int  hour;int  minute;int sec;};
class Date{
public:Date(int,int,int);friend void Time::display(Date &);    //声明Time类中的display函数为本类中的友元函数
private:int month;int day;int year;};
Time::Time(int h, int m, int s) {    //定义一个构造函数并对构造函数hour=h;minute=m;sec=s;}
void Time::display(Date &d) {cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;    //Time中的成员函数引用Date类中的私有成员数据cout<<hour<<":"<<minute<<":"<<sec<<endl;}
Date::Date(int m, int d, int y) {month=m;day=d;year=y;}
int main()
{Time t1(10,13,56);Date d1(12,25,2004);t1.display(d1);return 0;
}**
**/home/andrew/D/clion/bin/cmake/bin/cmake --build /home/andrew/文档/Clion/untitled5/cmake-build-debug --target untitled5 -- -j 8
Scanning dependencies of target untitled5
[ 50%] Building CXX object CMakeFiles/untitled5.dir/main.cpp.o
/home/andrew/文档/Clion/untitled5/main.cpp:5:8: error: variable ‘Date t3’ has initializer but incomplete typeDate t3(10,12,15);^
make[3]: *** [CMakeFiles/untitled5.dir/main.cpp.o] 错误 1
make[2]: *** [CMakeFiles/untitled5.dir/all] 错误 2
make[1]: *** [CMakeFiles/untitled5.dir/rule] 错误 2
make: *** [untitled5] 错误 2
**

C++友元函数神奇的friend相关推荐

  1. C++ 笔记(30)— 友元函数与友元类

    我们知道类的私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行.这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦. ...

  2. C++ primer 第七章之 友元函数与友元类

    1.为什么需要友元函数?  类具有封装和信息隐藏的特性: 只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的 ; 非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公 ...

  3. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  4. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

  5. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

  6. C++中的友元函数friend

    1.C++中的友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友 ...

  7. C++中友元函数和友元类

    友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: frien ...

  8. 运算符中的二元重载,为什么要调用友元函数而不是全局函数的问题

    #include <iostream>using namespace std; //实现运算符的重载 class A { public:A(int real=0,int imaginary ...

  9. C++友元函数和友元类(C++ friend)详解

    在看VISP视觉库的时候遇到友元函数: Friends void swap (vpDetectorAprilTag &o1, vpDetectorAprilTag &o2) 在定义一个 ...

最新文章

  1. 微信小店 API 手册
  2. MIMIC 以太坊医疗项目开发(2) 前端H5介绍
  3. java重命名sheet失败_java jxl excel 数据导出 重新命名无效的工作表名称 | 学步园...
  4. 'module' object has no attribute 'Env'
  5. 前端学习(1537):为什么使用ng
  6. java递归mysql生成树_JavaScript图形实例:递归生成树
  7. kafka报错:creating broker listeners from xxx unable to parse xxx:9092 to a broker endpoint
  8. Solidity-让合约地址 接受ETH的转账充值的 三种方式
  9. 深入解读OpenSURF中快速黑塞矩阵计算的思想——FastHessian_buildResponseLayer
  10. 初二计算机辅导记录,计算机一级OFFICE辅导:用Excel制作自动记录的考勤表
  11. 什么是探索性测试?探索性测试有哪些方法?
  12. JavaScript判断日期时间差的实例代码
  13. 易基因|一文读懂:八大RNA m6A甲基化研究核心问题
  14. numpy数组切片操作之[:,2]、[-1:,0:2]、[1:,-1:]等都是啥?
  15. 2019年电赛D题简易电路特性测试仪试题ad5933测量小阻抗值
  16. 玩转IE之自动切换代理服务器
  17. 微信小程序自动回复用户消息
  18. 网易云--荣格心理学测验
  19. 影视剪辑,7个创意转场及7个剪辑技巧,剪辑技巧分享
  20. 云计算效果如何,Mixpanel现身说法

热门文章

  1. nyoj--1007 GCD
  2. LIGHTOJ 1005(组合数学)
  3. 给创新工场求职者的一封信
  4. NYOJ 598 旋转圆柱矩阵
  5. NYOJ 127 星际之门(一)
  6. hdu 1042 N! 高精度运算
  7. SpringBoot异常处理的简单理解
  8. 设计模式学习之代理模式学习(一)
  9. 全球酒店详情查看API接口-基于极核数据
  10. C++ vector容器简单解释