- 浏览: 373450 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
四 友元函数
为了强调类的数据封装性,常将一些关键成员设为私有访问特性或保护访问特性。这样,在类的外面只能通过类的成员函数来访问这些成员,有时会觉得类的这种特性很不方便。但是,如果将这些成员的访问特性设为公有的,则又失去了类的封装性。为了解决这个矛盾,VC++中引入了友元函数的概念。对于某一个类来说,该类的友元函数可以是一个不属于任何类的普通函数,也可以是另一个成员函数。
1 友元函数的说明及使用
如果在一个类中使用关键字friend对一个不属于该类的外部函数进行说明,则外部函数就成为该类的友元函数,它可以访问该类的任何成员。例如:
在类中可以只对友元函数进行原型说明(如上面的友元函数print()),也可以在类中对友元函数进行定义(如上面的友元函数show())。
友元函数不是类的成员函数,所以在友元函数中对类的对象的成员进行访问时必须指明该成员所属的对象。
同样,由于友元函数不是类的成员,所以,友元函数是不受类中访问特性的限制的,如上例中的友元函数print(),虽然它是与私有成员一起说明的,但它的使用与友元函数show()一样不受类的访问权限的限制,并且在调用这些友元函数时也是直接调用,如程序中的A行和B行不能写成A.print(a1)和A.show(&a1)。
由于友元函数破坏了类的封装性,所以,它的使用有可能对程序带来一些不利的影响。通常,在友元函数中不修改类的成员数据而只用于读取类成员的数据。
2 友元成员函数及友元类
一个类放入友元函数可以是另一个类的成员函数,并且,如果将一个类说明为某类的友元类,则友元类的所有成员函数均为该类的友元函数。
其中,由于类A和类B的成员函数中均用到了类C的对象,所以类C在类A和B之后定义,则在使用它之前给出类C的说明,并且,程序中用到类C的对象的几个成员函数的函数体也只能在类C之后定义(如程序中的A,B,C行的函数)。当然,如果类C在类A和B之前定义,则无上述必要。
上述程序在类C中将类B说明为友元类,则表示类B的所有成员函数均为类C的友元函数。但这种友元关系是不可逆的,即类B为类C的友元并不代表类C也为类B的友元。
上述程序运行结果:
30 40
40 60
39 59
3 抽象类与友元函数
由于某些特殊需要,如果设计类的构造函数为私有或保护访问特性,则在正常情况下该类不能用来生成对象,但如果将某函数定义为该类的友元,则可以在该函数中生成该类的对像。如:
程序中类A的构造函数为保护访问特性,正常情况下不可以产生对象。但可以通过其友元函数来返回一个对象,这个返回的对象用来拷贝出一个全局作用域的对象a1(程序中的A行)。同时,由于主函数也为类A的友元,所以在主函数中可以输出对象a1的成员函数。程序运行输出如下:
10 20
为了强调类的数据封装性,常将一些关键成员设为私有访问特性或保护访问特性。这样,在类的外面只能通过类的成员函数来访问这些成员,有时会觉得类的这种特性很不方便。但是,如果将这些成员的访问特性设为公有的,则又失去了类的封装性。为了解决这个矛盾,VC++中引入了友元函数的概念。对于某一个类来说,该类的友元函数可以是一个不属于任何类的普通函数,也可以是另一个成员函数。
1 友元函数的说明及使用
如果在一个类中使用关键字friend对一个不属于该类的外部函数进行说明,则外部函数就成为该类的友元函数,它可以访问该类的任何成员。例如:
#include<iostream.h> class A{ int a,b; friend void print(A); public: A(int x,int y) {a=x;b=y;} friend void show(A *p) { cout<<p->a<<'\n'; cout<<p->b<<'\n'; } }; void print(A t) { cout<<t.a<<'\n'; cout<<t.b<<'\n'; } void main() { A a1(10,20); print(a1); //A行 show(&a1); //B行 }
在类中可以只对友元函数进行原型说明(如上面的友元函数print()),也可以在类中对友元函数进行定义(如上面的友元函数show())。
友元函数不是类的成员函数,所以在友元函数中对类的对象的成员进行访问时必须指明该成员所属的对象。
同样,由于友元函数不是类的成员,所以,友元函数是不受类中访问特性的限制的,如上例中的友元函数print(),虽然它是与私有成员一起说明的,但它的使用与友元函数show()一样不受类的访问权限的限制,并且在调用这些友元函数时也是直接调用,如程序中的A行和B行不能写成A.print(a1)和A.show(&a1)。
由于友元函数破坏了类的封装性,所以,它的使用有可能对程序带来一些不利的影响。通常,在友元函数中不修改类的成员数据而只用于读取类成员的数据。
2 友元成员函数及友元类
一个类放入友元函数可以是另一个类的成员函数,并且,如果将一个类说明为某类的友元类,则友元类的所有成员函数均为该类的友元函数。
#include<iostream.h> class C; class A{ int a,b; public: A(int x,int y) {a=x;b=y;} void addA(C &t); //A行 }; class B{ public : void sub(C &t); //B行 void show(C t); }; class C{ int a,b; public: C(int x,int y) {a=x;b=y;} friend void A::addA(C &t); //说明A的成员函数为友元 friend class B; //说明类B为友元 }; void A::addA(C &t) { t.a+=a; t.b+=b; } void B::sub(C &t) { t.a--; t.b--; } void B::show(C t) { cout<<t.a<<'\t'<<t.b<<'\n'; } void main() { A a1(10,20); B b1; C c1(30,40); b1.show(c1); a1.addA(c1); b1.show(c1); b1.sub(c1); b1.show(c1); }
其中,由于类A和类B的成员函数中均用到了类C的对象,所以类C在类A和B之后定义,则在使用它之前给出类C的说明,并且,程序中用到类C的对象的几个成员函数的函数体也只能在类C之后定义(如程序中的A,B,C行的函数)。当然,如果类C在类A和B之前定义,则无上述必要。
上述程序在类C中将类B说明为友元类,则表示类B的所有成员函数均为类C的友元函数。但这种友元关系是不可逆的,即类B为类C的友元并不代表类C也为类B的友元。
上述程序运行结果:
30 40
40 60
39 59
3 抽象类与友元函数
由于某些特殊需要,如果设计类的构造函数为私有或保护访问特性,则在正常情况下该类不能用来生成对象,但如果将某函数定义为该类的友元,则可以在该函数中生成该类的对像。如:
#include<iostream.h> class A{ int a,b; protected: A(int x,int y) {a=x;b=y;} friend A fun(); friend void main(); }; A fun() { A t(10,20); return t; } A a1(fun()); void main() { cout<<a1.a<<'\t'<<a1.b<<'\n'; }
程序中类A的构造函数为保护访问特性,正常情况下不可以产生对象。但可以通过其友元函数来返回一个对象,这个返回的对象用来拷贝出一个全局作用域的对象a1(程序中的A行)。同时,由于主函数也为类A的友元,所以在主函数中可以输出对象a1的成员函数。程序运行输出如下:
10 20
发表评论
-
FreeRTOS
2022-03-05 16:31 253Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 417https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1346https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 481https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 580// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 593https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5828583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 609参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2176基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9161 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1596OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1886ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 878转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1926转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1095C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 974转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1006转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 821参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1623转自 http://blog.csdn.net/weixinh ...
相关推荐
在C++编程语言中,"高级知识"通常指的是超越基础语法和控制流的概念,涉及到类、对象、模板、异常处理、内存管理等更深入的主题。在这个特定的课件中,我们关注的是“友元函数”和“外联函数”这两个核心概念,它们...
本项目名为“Practice_日期合并输出_友元函数”,显然是通过友元函数来实现这一功能,这涉及到类的封装、友元机制以及C++中的时间处理。以下是对这些知识点的详细解释: 1. **日期和时间处理**: C++标准库提供了`...
以下是一些C++基础知识的详细介绍: 1. **变量与数据类型**:在C++中,变量是存储数据的容器。每种变量都有特定的数据类型,如整型(int)、浮点型(float或double)、字符型(char)和布尔型(bool)。声明变量时需指定其...
总的来说,这份“C++入门经典+源代码及课后练习答案”的资源对于C++初学者来说是一份非常实用的学习资料,不仅可以帮助快速掌握C++基础知识,还可以通过实践和比较,提升编程技能和解决问题的能力。对于想要深入学习...
在复习时,确保对这些基础知识的掌握是非常关键的。对于客观题部分,可能会涉及C++语法的细节问题,如指针、引用、内存管理、模板等概念,需要理解它们的工作原理和应用场景。 指针是C++中的一大特色,它是内存地址...
- 部分学生可能存在知识遗忘或基础知识薄弱的问题,需要在学习过程中加强对《C 语言程序设计》的复习。 - **学生学习能力分析**: - 学生已经掌握了第一章中的函数重载概念,这为学习运算符重载奠定了基础。 - 在...
C++基础知识 C++基础知识是C++入门者和面试C++工程师岗位前的必备知识点总结。它涵盖了语法语义、STL、排序算法等面试常问的知识点。 一、面向对象的程序设计思想 面向对象的程序设计思想是把数据结构和对数据...
计算机C++基础题库 计算机C++基础题库是指对C++编程语言的基本概念、语法、特性和应用的总结和归纳。...本题库涵盖了计算机C++基础知识的多个方面,旨在帮助读者快速掌握C++编程语言的基本概念和应用。
### C++基础知识总结 #### 目录概览 本文档主要涵盖了C++语言的基础知识及其在实际开发中的应用,特别适合于C++的初学者。文档由多个章节组成,包括了C/C++语言特性、面向对象编程基础、内存管理、标准模板库(STL...
- **友元**:友元函数或友元类可以访问类的私有和保护成员,打破封装性。 - **运算符重载**:允许为已有的运算符提供新的含义,使其能作用于自定义类型。 - **模板**:泛型编程工具,可以创建泛型函数和泛型类,...
【C++基础知识】 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、应用软件、游戏开发等领域。它的基础知识包括: 1. **语法基础**:C++沿袭了C语言的基本语法,如变量声明、数据类型(int、char、...
"c++基础知识,语言点讲的很细"这个标题表明这是一份深入讲解C++基本概念和语法的资料,适合初学者或者需要巩固基础知识的开发者。这份资料可能涵盖了从基本语法到高级特性的全面内容,旨在帮助学习者建立扎实的C++...
### C++基础知识全面汇总 #### 一、字符串与字符处理 1. **字符串与字符的存储**:在C++中,字符串是由多个字符组成的数组,其中每个字符占用一个字节的空间。例如,字符串`"abc\0"`实际上占用4个字节的空间,包括...
本基础课件旨在全面介绍C++的基础知识,帮助初学者理解和掌握C++编程的基本概念和技术。 课件内容可能涵盖以下几个关键知识点: 1. **C++简介**:介绍C++的历史、特点和适用领域,以及与C语言的区别。 2. **基本...
11. **友元函数**:非成员函数可以被声明为类的友元,允许它访问类的私有和保护成员。 12. **匿名函数(lambda表达式)**:C++11引入,用于创建临时函数对象,常用于函数对象和算法库如`std::sort`。 13. **C++...
在“c++基础知识及面向对象课件”中,我们可以深入学习C++的核心概念,包括类与对象、继承与派生、多态性等,这些都是C++面向对象编程的基础。 首先,第4章“类与对象”介绍了C++的核心概念。类是C++中的蓝图,用于...
学习C++的基础知识,对于任何想要从事软件开发的人来说都是必要的。它不仅适用于系统级编程,也是游戏开发、嵌入式系统、桌面应用和大规模软件项目的重要选择。掌握C++的基础,不仅可以帮助理解其他高级编程语言,也...
### C++基础知识总结 #### 一、C++基础关键字与标识符 C++是一门功能强大的编程语言,它继承了C语言的优点,并在此基础上增加了面向对象等特性。在C++中,关键字是语言预定义的一些特殊标识符,它们具有特定的意义...