`

C++][基础知识4] 友元函数

    博客分类:
  • C++
 
阅读更多
四 友元函数
为了强调类的数据封装性,常将一些关键成员设为私有访问特性或保护访问特性。这样,在类的外面只能通过类的成员函数来访问这些成员,有时会觉得类的这种特性很不方便。但是,如果将这些成员的访问特性设为公有的,则又失去了类的封装性。为了解决这个矛盾,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
分享到:
评论

相关推荐

    C++高级知识,包括友元函数,外联函数

    在C++编程语言中,"高级知识"通常指的是超越基础语法和控制流的概念,涉及到类、对象、模板、异常处理、内存管理等更深入的主题。在这个特定的课件中,我们关注的是“友元函数”和“外联函数”这两个核心概念,它们...

    Practice_日期合并输出_友元函数_

    本项目名为“Practice_日期合并输出_友元函数”,显然是通过友元函数来实现这一功能,这涉及到类的封装、友元机制以及C++中的时间处理。以下是对这些知识点的详细解释: 1. **日期和时间处理**: C++标准库提供了`...

    c++ 基础知识手册

    以下是一些C++基础知识的详细介绍: 1. **变量与数据类型**:在C++中,变量是存储数据的容器。每种变量都有特定的数据类型,如整型(int)、浮点型(float或double)、字符型(char)和布尔型(bool)。声明变量时需指定其...

    c++入门经典+源代码及课后练习答案.zip

    总的来说,这份“C++入门经典+源代码及课后练习答案”的资源对于C++初学者来说是一份非常实用的学习资料,不仅可以帮助快速掌握C++基础知识,还可以通过实践和比较,提升编程技能和解决问题的能力。对于想要深入学习...

    C++ PTA习题总结 期末复习

    在复习时,确保对这些基础知识的掌握是非常关键的。对于客观题部分,可能会涉及C++语法的细节问题,如指针、引用、内存管理、模板等概念,需要理解它们的工作原理和应用场景。 指针是C++中的一大特色,它是内存地址...

    课程思政-c++语言程序设计

    - 部分学生可能存在知识遗忘或基础知识薄弱的问题,需要在学习过程中加强对《C 语言程序设计》的复习。 - **学生学习能力分析**: - 学生已经掌握了第一章中的函数重载概念,这为学习运算符重载奠定了基础。 - 在...

    C++基础知识.doc

    C++基础知识 C++基础知识是C++入门者和面试C++工程师岗位前的必备知识点总结。它涵盖了语法语义、STL、排序算法等面试常问的知识点。 一、面向对象的程序设计思想 面向对象的程序设计思想是把数据结构和对数据...

    计算机C++基础题库

    计算机C++基础题库 计算机C++基础题库是指对C++编程语言的基本概念、语法、特性和应用的总结和归纳。...本题库涵盖了计算机C++基础知识的多个方面,旨在帮助读者快速掌握C++编程语言的基本概念和应用。

    C++ 基础知识总结_终稿_124.pdf

    ### C++基础知识总结 #### 目录概览 本文档主要涵盖了C++语言的基础知识及其在实际开发中的应用,特别适合于C++的初学者。文档由多个章节组成,包括了C/C++语言特性、面向对象编程基础、内存管理、标准模板库(STL...

    C++基础知识课件 PPT

    - **友元**:友元函数或友元类可以访问类的私有和保护成员,打破封装性。 - **运算符重载**:允许为已有的运算符提供新的含义,使其能作用于自定义类型。 - **模板**:泛型编程工具,可以创建泛型函数和泛型类,...

    c++基础知识,sql基础知识

    【C++基础知识】 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、应用软件、游戏开发等领域。它的基础知识包括: 1. **语法基础**:C++沿袭了C语言的基本语法,如变量声明、数据类型(int、char、...

    c++基础知识,语言点讲的很细

    "c++基础知识,语言点讲的很细"这个标题表明这是一份深入讲解C++基本概念和语法的资料,适合初学者或者需要巩固基础知识的开发者。这份资料可能涵盖了从基本语法到高级特性的全面内容,旨在帮助学习者建立扎实的C++...

    C++基础知识全面汇总

    ### C++基础知识全面汇总 #### 一、字符串与字符处理 1. **字符串与字符的存储**:在C++中,字符串是由多个字符组成的数组,其中每个字符占用一个字节的空间。例如,字符串`"abc\0"`实际上占用4个字节的空间,包括...

    C++基础课件,讲述C++基础知识

    本基础课件旨在全面介绍C++的基础知识,帮助初学者理解和掌握C++编程的基本概念和技术。 课件内容可能涵盖以下几个关键知识点: 1. **C++简介**:介绍C++的历史、特点和适用领域,以及与C语言的区别。 2. **基本...

    C++函数编程20道习题汇总含其详细程序解答_C++_

    11. **友元函数**:非成员函数可以被声明为类的友元,允许它访问类的私有和保护成员。 12. **匿名函数(lambda表达式)**:C++11引入,用于创建临时函数对象,常用于函数对象和算法库如`std::sort`。 13. **C++...

    c++基础知识及面向对象课件

    在“c++基础知识及面向对象课件”中,我们可以深入学习C++的核心概念,包括类与对象、继承与派生、多态性等,这些都是C++面向对象编程的基础。 首先,第4章“类与对象”介绍了C++的核心概念。类是C++中的蓝图,用于...

    C++基础知识学习课件

    学习C++的基础知识,对于任何想要从事软件开发的人来说都是必要的。它不仅适用于系统级编程,也是游戏开发、嵌入式系统、桌面应用和大规模软件项目的重要选择。掌握C++的基础,不仅可以帮助理解其他高级编程语言,也...

    c++基础知识总结概括

    ### C++基础知识总结 #### 一、C++基础关键字与标识符 C++是一门功能强大的编程语言,它继承了C语言的优点,并在此基础上增加了面向对象等特性。在C++中,关键字是语言预定义的一些特殊标识符,它们具有特定的意义...

Global site tag (gtag.js) - Google Analytics