C++ 友元的一点总结

1.是什么?

友元机制允许一个类将对其非公有成员的访问权授予制定的函数或类。 ——《c++ primer》

2.为什么要提出?:

类中一些成员函数使用较为频繁,需要大量时间开销,为了减少时间开销,就允许破坏程序的封装性,使用一个外部函数或类可以访问该类中的私有成员。所以友元的作用在于提高程序的运行效率(即减少了类型检查和安全性检查等都需要的时间开销)。

3.友元的问题:

友元的使用破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

4.友元的历史:

友元的产生是由于最初电脑的运行速度没有现在快,而C++语言讲的就是速度,为了解决其它类方便访问类的私有变量或者说是私有成员函数,故就使用了友元这个机制,但是现在的电脑速度的提高,友元所产生的作用也渐渐地看不出效果来了,但是C++标准没有把友元取消.

5.友元使用的注意点:

友元有点突破了面向对象思想的封装性,能少用就少用。

下面说一下什么时候使用友元函数和友元类,其实二者没有太大的区别,如果只是一般函数访问类的私有成员或者说是私有数据成员,使用友元函数就可以了,如果是使用类来访问其它类的私有数据成员和私有成员函数就使用友元类.

友元的声明以关键字friend开始,只能出现在类定义的内部,友元声明可以出现在类中任何地方,友元不是授予友元关系的那个类的成员,所以他们不受其声明出现部分的访问控制影响。通常最好放在类定义的开始或结尾。


给个例子:

(1) For class Point(点), define two functions to implement the same capability—calculate the distance between two points. One function is defined as member function of Point (named distance_2), the other is defined as friend function (named distance_1). Complete the definition of class Point to make the program run successfully. Keep the output in your document.

#include <iostream>
#include <cmath>
using namespace std;

class Point
{
     friend double distance_1(Point&,Point&);
public:
     Point( double xx = 0.0, double yy = 0.0 ) { x = xx; y = yy; }
     double getX() { return x; }
     double getY() { return y; }
     double distance_2 ( Point &);
private:
     double x,y;
};

double distance_1 ( Point & a, Point &b)
{
     return  sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}

double Point::distance_2 ( Point & p)
{
     return sqrt(pow(x-p.x,2)+pow(y-p.y,2));
}

int main()
{
     Point p1(3, 5), p2(4, 6);
     double result1 = distance_1(p1, p2);
     double result2 = p1.distance_2(p2);
     cout << "The distance is  " << result1 << ‘\t‘<< result2 << endl;
     return 0;
}

这里分别使用成员函数和友元函数对两点之间的距离进行了计算。这里需要注意的是这里只有distance_1可以声明为友元函数,而distance_2不能声明为友元函数。因为distance_2只有一个参数,并且友元函数不是成员函数,不能对一个参数进行距离计算

时间: 2024-08-05 07:06:21

C++ 友元的一点总结的相关文章

c++的友元类、方法及其益处

在java中,我们知道除了public和private,protected外,还有默认的包可见性访问级别,虽然如此,很多时候出于早期设计缺陷的原因,我们需要访问一些包或者protected可见性级别的方法,这个时候就比较麻烦了,要是选择和目标服务在相同包中,总看起来很奇怪,如果作为子类继承,则更加奇怪.但是我们又不想把该接口服务的可见性声明为public. c++中,这一点做的就比较好,我们知道在c++中,有友元类.方法的特性,该特性相当于白名单的作用,当一个类或者成员函数.非OO函数被声明为目

C++学习笔记之友元

一.引言 C++控制对类对象私有部分(private)的访问,通常只能通过公有的(public)类方法去访问.但是有时候这种限制太严格,不适合特定的问题,于是C++提供了另外一种形式的访问权限:友元.友元有三种: 友元函数 友元类 友元成员函数 二.友元函数 通过让函数称为友元函数,可以赋予该函数与类的成员函数相同的访问权限.为何需要友元呢?在为类重载二元运算符时常常需要友元,关于运算符的重载可以参考我的博文: C++学习笔记之运算符重载 下面举例说明: 1 //mytime0 2 #ifnde

队列(queue) 之 c++模板实现(友元函数和运算符重载)

一:起因 (0)拿出自己年初实现的queue队列,第一次用c++类实现queue,在和如今实现的其他复杂的STL对比,心情无比复杂: 注释:看到听到当年自己的所写所想,正的是一种享受 -- 倾听自己的幼稚也是一种美. (1)闲话少说了,我自己现在回答自己的 三 (5) 中提到的问题,函数的返回值是用bool型还是void型??其实函数返回值是bool 还是 void是视情况而定的:例如,判空函数bool isEmpty(),比较运算符重载函数 bool operator >=(&)等判断函数

由友元来窥探C++的博大精深

今天,复习C++基础知识友元这一节的内容,考证C++为什么定义了这一看似矛盾的机制:C++提倡以类为单位编程,注重对类的封装与信息隐蔽,但友元的出现破坏了这一原则,相当于在一堵墙上开了一个小洞.C++为什么要左右手互搏呢? 其实,看似矛盾的这一点体现C++的博大精深,分析如下: 作为一种编程技术手段,友元为程序员提供了一种面向对象程序和面向过程程序相互衔接的接口.从根本上说面向对象的分析与设计方法并不能彻底解决现实世界中的一切需求.许多按照对象化设计的软件系统常常保留一些供早期程序访问的接口,来

C++ friend友元函数和友元类(转)

一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情况--友元(friend).借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员.fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些.我们会对好朋友敞开心扉,倾诉自己的秘密,而对一般人会谨言慎行,潜意识里就自我保护.在C+

为什么operator&lt;&lt;&gt;&gt;运算符重载一定要为友元函数呢?

如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身...... 而 >>  或<< 左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点........就只能申明为友元函数了... 如果一定要声明为成员函数,只能成为如下的形式: ostream & operator<<(ostream &output) { return output; } 所以在运用这个<<运算符时就变为这种形

C#友元程序集

internal:对友元程序集和内部可见.我们可以利用这一点,使我们开发的类库更加地安全.比如,你不喜欢你开发的ClassLib( DLL ),被其他公司或团队使用,就可以在使用internal , 当然还要加上友元程序集的相关知识. 上代码: TestFrendsAbb 类库 ToolsBytes using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.

static 类中的静态成员,组合类,友元函数 ,内部类

static 表示静态的意思 在c++中有两种表示 ,静态成员变量和静态成员函数 一个类中的静态成员只属于当前类,不属于某个对象.一个类的静态成员只有一份由当前类所有,每个对象都可以访问静态成员,当然也可以通过类名来访问 这里推荐用类名::静态成员来访问 static 成员函数应该在所有的成员函数之外初始化 如果不初始化系统默认为0 static 成员函数只能访问static成员 static成员函数  ,函数体内不能使用this指针 在我前前面已经说过组合类的概念了,今天我再介绍两个类,友元,

C++之友元函数和友元类

通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. #include<iostream>using namespace std; class book{public:    book()    {       cout <<this->price << endl;  //这里是没有赋值的成员变量就使用,这是不可取的       cout << this->title << e