在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:
通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。
友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。
在类里声明一个普通函数,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。
下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。
#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("ITEYE","www.iteye.com");
ShowN(a);
cin.get();
}
上面的代码通过友元函数的定义,我们成功的访问到了a对象的保护成员name,友元函数并不能看做是类的成员函数,它只是个被声明为类友元的普通函数,所以在类外部函数的定义部分不能够写成void Internet::ShowN(Internet &obj),这一点要注意。
一个普通函数可以是多个类的友元函数,对上面的代码我们进行修改,注意观察变化:
#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("ITEYE","www.iteye.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("ITEYE","www.iteye.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("ITEYE","www.iteye.com");
Country b;
a.Editcname(b);
cin.get();
}
在上面的代码中我们成功的通过Internet类Editcname成员函数操作了Country类的保护成员cname。
在编程中,我们使用友元的另外一个重要原因是为了方便重载操作符的使用,这些内容我们将在后面的教程着重讨论!
分享到:
相关推荐
C++中的友元函数是一种特殊的功能,它允许非成员函数访问类的私有(private)或保护(protected)成员,打破了封装性原则。这在某些情况下可以提高代码的效率和灵活性,但同时也增加了代码的复杂性和潜在的风险。...
《C++入门经典》是一本深受初学者喜爱的编程教材,它系统地介绍了C++语言的基础知识和编程技巧。这份压缩包包含的就是该书的配套源代码和课后练习的答案,对于正在学习C++的人来说,这是一个非常宝贵的资源。 C++是...
C++支持公有成员、私有成员、友元函数等概念,以及构造函数、析构函数、拷贝构造函数等特殊函数,这些都是理解和设计复杂程序的关键。 C++的继承和多态特性进一步增强了面向对象编程的能力。继承使得类之间可以建立...
"快速入门的C++课件"是专为初学者设计的学习资源,旨在帮助学习者高效地掌握C++的基础知识和核心概念。这个经典版的课件集包含了多个部分,覆盖了C++的不同主题,从基础到进阶,逐步引导学习者进入编程世界。 首先...
本书是为C++程序设计学习者量身订做的辅导书。全书分为3篇。第一篇介绍了面向过程...本书的内容涵盖了绝大部分常用的C++知识,可以作为大学计算机专业或非计算机专业的程序设计入门教材,也可供计算机爱好者自学使用。
这是DS小龙哥编写整理的C++入门指南PDF文档,适合C++初学者,C语言转C++工程师当做入门工具书学习。PDF里有完整示例、知识讲解,平时开发都可以复制粘贴,非常便捷。 目前一共写了7章,后续会持续更新资源包,更新后...
详细介绍了C++中友元的使用,适合C++入门者参考学习。
鸡啄米:C++编程入门系列之二十二(C++程序设计必知:友元) 鸡啄米:C++编程入门系列之二十三(C++程序设计必知:常引用、常对 象和对象的常成员) 鸡啄米:C++编程入门系列之二十四(C++程序设计必知:多文件...
理解构造函数、析构函数、成员函数、友元、继承、多态等概念,是深入理解C++的关键。 六、模板 模板是C++的一个强大工具,允许开发者创建泛型代码,可以在多种数据类型上工作。函数模板和类模板允许我们写出通用的...
C++编程入门是初学者踏入计算机编程世界的重要一步。C++是一种强大且广泛应用的面向对象编程语言,由Bjarne Stroustrup在C语言的基础上发展而来。本系列旨在为新手提供一个全面而深入的C++学习路径,涵盖了一系列...
"C++讲稿C++入门课件"是清华大学教师为初学者准备的教学资料,旨在帮助学生快速理解和掌握C++的基础知识。 C++的特点在于它的面向对象编程(OOP)特性,包括封装、继承和多态性。封装允许将数据和操作这些数据的...
C++入门实用知识库分享 C++是一种高效、灵活、可移植的编程语言,它具有以下几个特点: 1. 高效性:C++语言可以生成高效的目标代码,编译器可以对代码进行优化,从而提高程序的执行速度。 2. 灵活性:C++语言提供...
C++是一种强大的、通用的编程语言,被广泛应用...而《易学C++》则可能以更直观的方式讲解基础知识,适合快速入门。通过阅读这两本书,结合实际编程练习,相信你能够逐步掌握C++编程,并逐步成长为一名熟练的C++程序员。
从给定的C++练习题中,我们可以提炼出一系列重要的C++知识点,这些知识点对于初学者来说至关重要,有助于他们理解并掌握C++编程的基础与进阶概念。 ### 1. C++基本概念 - **枚举类型**:题目中提到了“枚举”这一...
C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和longjmp()函数。 二、关键字和变量 C++相对与C增加了一些关键字,如下: typename bool dynamic_cast mutable namespace static_cast using ...
本课件“C++从入门到精通”旨在帮助初学者掌握C++的基础知识和高级特性,从而实现从零基础到熟练掌握的过渡。 首先,C++基于C语言,它引入了面向对象编程(OOP)的概念,包括类、对象、封装、继承和多态性。在PPT中...
"C++编程入门实例100篇(含源码)"这个资源提供了丰富的实践机会,帮助学习者通过实际操作来加深对C++的理解。 C++的特点在于它的面向对象编程(OOP)特性,包括封装、继承和多态性。封装允许我们将数据和操作数据的...