下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。

#include <iostream>   
using namespace std;
class Internet   
{   
public:   
    Internet(char *name,char *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);    
    }
friend void ShowN(Internet &obj);//友元函数的声明
public:   
    char name[20];
    char address[20];
};
 
 
void ShowN(Internet &obj)//函数定义,不能写成,void Internet::ShowN(Internet &obj)
{
    cout<<obj.name<<endl;
}
void main()   
{
    Internet a("中国软件开发实验室","www.cndev-lab.com");
    ShowN(a);
    cin.get();

1#include <iostream>   
 2using namespace std;
 3class Internet   
 4{   
 5public:   
 6    Internet(char *name,char *address)   
 7    {   
 8        strcpy(Internet::name,name);   
 9        strcpy(Internet::address,address);    
10    }
11friend void ShowN(Internet &obj);//友元函数的声明
12public:   
13    char name[20];
14    char address[20];
15};
16 
17 
18void ShowN(Internet &obj)//函数定义,不能写成,void Internet::ShowN(Internet &obj)
19{
20    cout<<obj.name<<endl;
21}
22void main()   
23{
24    Internet a("中国软件开发实验室","www.cndev-lab.com");
25    ShowN(a);
26    cin.get();
27}

一个普通函数可以是多个类的友元函数,对上面的代码我们进行修改,注意观察变化:


#include <iostream>   
using namespace std;
class Country;
class Internet   
{   
public:   
    Internet(char *name,char *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);    
    }
friend void ShowN(Internet &obj,Country &cn);//注意这里
public:   
    char name[20];
    char address[20];
};
 
class Country
{
public:
    Country()
    {
        strcpy(cname,"中国");
    }
friend void ShowN(Internet &obj,Country &cn);//注意这里
protected:
    char cname[30];
};
 
void ShowN(Internet &obj,Country &cn)
{
    cout<<cn.cname<<"|"<<obj.name<<endl;
}
void main()   
{
    Internet a("中国软件开发实验室","www.cndev-lab.com");
    Country b;
    ShowN(a,b);
    cin.get();
}

  一个类的成员函数函数也可以是另一个类的友元,从而可以使得一个类的成员函数可以操作另一个类的数据成员,我们在下面的代码中增加一类Country,注意观察:


#include <iostream>   
using namespace std;
class Internet;
 
class Country
{
public:
    Country()
    {
        strcpy(cname,"中国");
    }
    void Editurl(Internet &temp);//成员函数的声明
protected:
    char cname[30];
};
class Internet
{   
public:   
    Internet(char *name,char *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);  
    }
    friend void Country::Editurl(Internet &temp);//友元函数的声明
protected:   
    char name[20];
    char address[20];
};
void Country::Editurl(Internet &temp)//成员函数的外部定义
{
    strcpy(temp.address,"edu.cndev-lab.com");
    cout<<temp.name<<"|"<<temp.address<<endl;
}
void main()
{
    Internet a("中国软件开发实验室","www.cndev-lab.com");
    Country b;
    b.Editurl(a);
    cin.get();
}

  整个类也可以是另一个类的友元,该友元也可以称做为友类。友类的每个成员函数都可以访问另一个类的所有成员。

示例代码如下:


#include <iostream>   
using namespace std;
class Internet;
 
class Country
{
public:
    Country()
    {
        strcpy(cname,"中国");
    }
    friend class Internet;//友类的声明
protected:
    char cname[30];
};
class Internet
{
public:   
    Internet(char *name,char *address)   
    {   
        strcpy(Internet::name,name);   
        strcpy(Internet::address,address);  
    }
    void Editcname(Country &temp);
protected:   
    char name[20];
    char address[20];
};
void Internet::Editcname(Country &temp)
{
    strcpy(temp.cname,"中华人民共和国");  
}
void main()
{
    Internet a("中国软件开发实验室","www.cndev-lab.com");
    Country b;
    a.Editcname(b);
    cin.get();
}

  在上面的代码中我们成功的通过Internet类Editcname成员函数操作了Country类的保护成员cname。

  在编程中,我们使用友元的另外一个重要原因是为了方便重载操作符的使用,这些内容我们将在后面的教程着重讨论!

参考:
http://www.pconline.com.cn/pcedu/empolder/gj/c/0503/571623_1.html

C++笔记(6)友元相关推荐

  1. C++学习笔记3 友元

    C++学习笔记3 0.概述 友元提供了一种 普通函数或者类成员函数 访问另一个类中的私有或保护成员 的机制.也就是说有两种形式的友元: (1)友元函数:普通函数对一个访问某个类中的私有或保护成员. ( ...

  2. c++学习笔记之友元函数

    友元函数例子代码功能用来显示时间 display函数放在time类中作为date类的友元函数 #include<iostream> using namespace std; class d ...

  3. C++工作笔记-对友元函数的进一步理解

    这里在GitHub上看redis相关的代码发现的.再次记录下. 友元的特点就是他是普通函数,并不是成员函数.他可以调用这个类的私有成员. 这里有个实际用法: 如上的redisAsyncCommand函 ...

  4. (22)C++ 类 对象

    C++ 类 & 对象 C++ 类定义 定义 C++ 对象 访问数据成员 类 & 对象详解 C++ 类成员函数 笔记 1.`::` 详解 2.类中的成员函数与 inline 3.C++中 ...

  5. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  6. C++阶段03笔记02【类和对象(封装、对象的初始化和清理、对象模型和this指针、友元、运算符重载、继承、多态)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 1.内存分区模型 2.引用 3.函数提高 4.类和对象 4.1.封装 4.1.1.封装的意义 --实例1:设计圆类 --实例2: ...

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

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

  8. 复习笔记(七)——C++友元

    目录 类的友元 友元函数 实例 友元函数的注意事项 友元类 实例 类的友元 可以把某些选定的函数看作类的"荣誉函数",允许它们访问类对象中非公共的成员,就好像它们是类的成员一样,这 ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元

    1. 定义 如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定实例. 1.1 一对一友好关系 类模板与另一个(类或 ...

  10. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

最新文章

  1. iPhone 6 Screens Demystified
  2. C++静态成员和静态成员函数
  3. JAVA语法——经典题目01
  4. java富文本如何转义_富文本编辑器wangEditor中转义字符的问题
  5. 吴恩达机器学习+林轩田机器学习+高等数学和线性代数等视频领取
  6. MySQL5.7数据库软件下载教程
  7. c语言自动取款机贴吧,求助 简单atm机的循环操作
  8. 1215课后练习----判断字符串位置
  9. 大数据在企业中的运用
  10. anywhere随启随用的静态文件服务器
  11. windows桌面动态主题_如何在Windows 10上安装桌面主题
  12. vue常用的几个框架
  13. 文献解读-物理信息深度学习(PINN)
  14. 通过谷歌身份验证器实现双保险认证(1)
  15. JavaScript实现移动端跟手轮播图
  16. [摘录]第3章 终局谈判策略
  17. 《软件工艺》目录—导读
  18. Django:在DDTCMS中使用Photologue做相册并增加封面的探索
  19. 智能电子秤方案测脂肪模块设计
  20. Python实现数据保存为PSV文件(先创建CSV,转换成PSV)

热门文章

  1. flask + websocket实现简单的单聊和群聊
  2. UVA11082 行列模型
  3. Javascript 535种方式!!!实现页面重载
  4. Android开发技术周报 Issue#38
  5. HTML day02(html列表与菜单的制作)
  6. 符号“”和const在函数里不同位置的用法
  7. CodeForces 2B The least round way
  8. AS3 库资源 很多非常有用的类库
  9. JAVA线程池shutdown和shutdownNow的区别
  10. pig0.15+hadoop2.x安装 (注意版本匹配)