友元函数

在类的声明中可以声明某一个函数作为该类的友元函数,然后该函数就可以访问类中的private数据成员了。

demo:

/*
wirten by qianshou
2013/12/6
04:13 pm
study at SDNU
*/
#include<iostream>
using namespace std;
class Time
{
public:
Time(int h,int m,int s);
friend void display(Time &t);//声明display函数为本类的友元成员函数
void show();
private:
int hour;
int minute;
int second;
};
class Date
{
public:
Date(int,int,int);
friend void display(Date &d);//声明display函数为本类的友元成员函数
private:
int month;
int day;
int year;
};
Time::Time(int h,int m,int s)//Time的构造函数
{
hour=h;
minute=m;
second=s;
}
void Time::show()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
void display(Date &d) //用于输出Date数据的display函数
{
cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
}
void display(Time &t) //用于输出Time数据的display函数
{
t.show();
}
Date::Date(int m,int d,int y)//Date的构造函数
{
month=m;
day=d;
year=y;
}
int main()
{
Time t1(12,30,45);
Date d1(12,6,2013);
display(d1);
display(t1);
return 0;
}

display函数是类Date和Time的友元函数,通过重载函数dispaly(根据传递的参数不同),实现对Time类对象和Date类对象的输出。

程序输出结果:

/*****

12/6/2013
12:30:45 *******/

友元成员函数

在类A的定义中,声明类B的成员函数fun()作为类A的友元成员函数。那么类B的成员函数fun()就可以访问类A中的数据成员了。

demo:

/*
wirten by qianshou
2013/12/6
study at SDNU
*/
#include<iostream>
using namespace std;
class Date; //对类的提前声明
class Time
{
public:
Time(int h,int m,int s);
void display(Date &d);
private:
int hour;
int minute;
int second;
};
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) //Time的构造函数
{
hour=h;
minute=m;
second=s;
}
void Time::display(Date &d) //对类Time中的成员函数display的定义
{
cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
Date::Date(int m,int d,int y) //Date的构造函数
{
month=m;
day=d;
year=y;
}
int main()
{
Time t1(12,30,45);
Date d1(12,6,2013);
t1.display(d1);
return 0;
}

在类Date中,声明了Time类中的display函数作为Date类的友元函数,因此在display函数中既可以访问Time类中的数据成员,又可以访问Date类中的数据成员。

程序输出结果:

/*****

12/6/2013
12:30:45 *******/

友元类

声明类B为类A的友元类,然后类B中的成员函数就可以访问类A中的数据成员了。但是,要注意友元的关系是单向的,即A声明了B是它的友元之后,B中的成员函数可以访问A中的private数据成员,但是A不能访问B中的private数据成员。

demo:

/*
wirten by qianshou
2013/12/6
study at SDNU
*/
#include<iostream>
using namespace std;
class Date; //对类的提前声明
class Time
{
public:
Time(int h,int m,int s);
void display(Date &d);
private:
int hour;
int minute;
int second;
};
class Date
{
public:
Date(int,int,int);
friend Time;//声明Time类是它的友元类
private:
int month;
int day;
int year;
};
Time::Time(int h,int m,int s) //Time的构造函数
{
hour=h;
minute=m;
second=s;
}
void Time::display(Date &d) //对类Time中的成员函数display的定义
{
cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
Date::Date(int m,int d,int y) //Date的构造函数
{
month=m;
day=d;
year=y;
}
int main()
{
Time t1(12,30,45);
Date d1(12,6,2013);
t1.display(d1);
return 0;
}

在Date类中声明了Time类作为它的友元类,所以Time类的成员函数display可以访问Date类中的私有成员。

程序输出结果:

/*****

12/6/2013
12:30:45 *******/

C++中的友元的更多相关文章

  1. C++中的友元函数和友元类

    C++中的友元函数主要应用于以下场景: 友元函数 第一种场景 代码中有一个全局函数,该函数想要去访问某个类的成员变量(该类的成员变量是private的,且该类并未提供任何获取获取私有成员变量的publ ...

  2. C#中实现C++中的友元类

    最近做一个小程序,一个类A(负责显示处理)需要大量调用类B(负责数据处理)的函数,我最先想到的C++中的友元概念,因为类B中的这些函数并不希望public,它只是允许类A调用监测. 网上搜索了一下,没 ...

  3. 04 c++中的友元

    c++中的类具有封装性,类中的私有数据只有该类的成员函数可以访问,程序中访问类中的私有成员,必须通过对象来调用成员函数,但是频繁的调用会使运行效率降低. 为了解决上述问题,c++中加入友元机制,友元可 ...

  4. 浅谈C++中的友元关系

    在封装中C++类数据成员大多情况是private属性:但是如果接口采用多参数实现肯定影响程序效率:然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的"后门" ...

  5. 关于C++中的友元函数的总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...

  6. c++中的友元函数

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...

  7. C++中的友元函数的总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...

  8. C++中的友元小结

    我们知道,在一个类总可以有公有的(public)成员和私有的(private)成员.在类外可以访问公用成员,只有本类中的函数可以访问本类的私有成员. 现在,我们学习一种新的情况--友元. 在C++中, ...

  9. C++ 中的友元(friend)

    首先友元不是一个好的设计,它破坏了封装.并且自身有很多局限:比如友元关系不能被继承:友元关系是单向的,不具有交换性:友元关系不具有传递性. 类内声明的 friend 变量(或者函数)在访问该类的成员时 ...

随机推荐

  1. es6基础入门变量的解构赋值

    let [a, b, c] = [1, 2, 3]; let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar baz let [ , , third] = [ ...

  2. 20180403_调bug_大地保险_jar包冲突

    一.异常现象 他们程序在本地通过java形式直接跑起来的时候,是正常的. 但是测试服务器上,程序跑到一半就不继续往下走了,而且,也不报错,日志里面没有任何信息. 二.异常解决 1.核心思想 抽丝剥茧, ...

  3. python_判断字符串编码的方法

    1. 安装chardet 在命令行中,进入Python27\Scripts目录,输入以下的命令:easy_install chardet 2. 操作 import chardet f = open(' ...

  4. 剑指Offer-翻转单词顺序

    题目描述: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符串的顺序不变.例如输入字符串:"I am a student",则输出"student a am I&qu ...

  5. uva1605 - Building for UN(构造法)

    这道题构造出的结果很妙,考察思维能力.就两层,每层都n*n个格子,第一层第i行都放国家i,第二层第j列都放国家j. 需要注意的是ASCII中A至Z在a至z的前面(数字小),而且它们两组不挨着.所以需要 ...

  6. Zeroc Ice 发布订阅者之demo Icestorm之clock

    刚刚在服务端(192.168.0.113)和客户端跑通(192.168.0.188),在这里记录,作为备忘. 第一步:读readme,先用vs2010生成subscriber.exe和publishe ...

  7. mysql数据库优化。(强力推荐)

    本文转自:https://m.aliyun.com/yunqi/articles/38809 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善 ...

  8. mysql 多表查询 左联 去重方法

    1.数据库中的两张表: 2.传统左联查询数据结果如下: 3.替换查询语句可得到去重数据结果:

  9. XML数据库的尝试

    首先祝大家新年快乐.身体健康,平安就是福气. 对于一般的个人迷你项目,数据量不大的时候,完全没有必要使用数据库,管理数据使用XML就可以了. 自己尝试写了一个XML数据库,插入1w条小记录,大概3M大 ...

  10. 在Azure上搭建L2TP服务器

    L2TP是常用的一种point-site的VPN.而目前在Azure上的VPN Gateway只支持IPsec和SSTP两种.如果客户需要L2TP服务器,需要自己在VM中搭建.本文将介绍如何在Azur ...