zoukankan      html  css  js  c++  java
  • 友元函数C++笔记四:友元

    本文笔者在青岛逛街的时候突然想到的...今天就有想写几篇关于友元函数的笔记,所以回家到以后就奋笔疾书的写出来发布了

               友元 friend     

               有时候你须要拜访一个类的所有成员,而这类拜访方法在逻辑上又不是被拜访类的接口。你也不希望破坏类的权限机制。比如你希望能给你的宠物对象取名字(宠物是不会自己取名字的),你又不希望其他人能给你的宠物取名字。这时候友元机制就出来了。你可以在宠物类中指定主人类、你的挚友类为友元。只让他们可以拜访宠物类的名字属性。还有被重载的操作符,经常须要拜访类的私有数据,这些操作又是类的成员。

                友元机制允许一个类将其所有成员的拜访权授予指定的函数或类。友元的声明以关键字friend开始,可以出现在类定义的任何地方。由于友元不是类的成员,所以不受类拜访权限机制的影响,也不能通过类来拜访友元(说了它不是类的成员)。

         

               友元函数(普通函数)

               1.友元函数不是类的成员,只是一个有特别权限的全局函数。

               2.友元函数可以声明在类的任何地方。

               3.友元函数的全部定义可以放在所拜访类的定义中,这样的友元函数默以为inline函数。

               4.友元函数在类外的定义不要带关键字friend。

               5.友元函数必须有一个参数时要拜访类的类型。因为友元函数不是类的成员,必须通过类对象.成员变量的方法来拜访对象的成员变量。

        

    #include <iostream>
    using std::cout;
    using std::endl;
    class CBox // Class definition at global scope
    {
    public:
    // Constructor definition
    	explicit CBox(double lv = 1.0, double bv = 1.0, double hv = 1.0)
    	{
    		cout << endl << “Constructor called.”;
    		m_Length = lv; // Set values of
    		m_Width = bv; // data members
    		m_Height = hv;
    	}
    // Function to calculate the volume of a box
    	double Volume()
    	{
    		return m_Length*m_Width*m_Height;
    	}
    private:
    	double m_Length; // Length of a box in inches
    	double m_Width; // Width of a box in inches
    	double m_Height; // Height of a box in inches
    // Friend function
    friend double BoxSurface(CBox aBox);
    };
    // friend function to calculate the surface area of a Box object
    double BoxSurface(CBox aBox)
    {
    	return 2.0*(aBox.m_Length*aBox.m_Width +
    	aBox.m_Length*aBox.m_Height +
    	aBox.m_Height*aBox.m_Width);
    }
    int main()
    {
    	CBox box2; // Declare box2 - no initial values
    
    	cout<< “Surface area of box2 = “<< BoxSurface(box2);
    	cout << endl;
    	return 0;
    }
        每日一道理
    岭上娇艳的鲜花,怎敌她美丽的容颜?山间清澈的小溪,怎比她纯洁的心灵?

           6.尽管对友元函数声明在类中出现的位置没有限制,当为了便于阅读,类中所有友元函数的位置保持一致。比如都放在public成员和private成员以后。

        
           指定其他类的成员函数成为友元

               和普通友元函数一样,只是在声明的时候加上类作用域,指明友元函数所属的类。 比如

        friend void A::func(Box&);

        

               指定其他类为友元         

               指定其他类为友元后,则该其他类的所有成员函数都可以可以拜访授权类的所有成员。

        

        关于成员函数设为友元应注意的声明问题

               指定A类的成员函数为B类的友元之前必须先看到A类的定义(注意不是声明)。先定义A时,如果A的这个成员函数要用A类型作参数,则必须先在B类之前声明A是一个类(比必要是定义)。

        上面是演示

        

    #include <iostream>
    using std::cout;
    using std::endl;
    
    class A
    {
    public:
    	class B;       //声明类B
    	void func(B&);
    };
    void A::func(B&)
    {//定义类A的成员函数func
    }
    
    class B
    {
    	friend void A::func(B&);
    };
    
    
    int main(void)
    {
    	return 0;
    }

        上面在类A的定义中在声明了类B。要不然通不过编译。而且A的成员函数func必须先定义,而且不能是内联函数(这意味着不能在类的声明中实现一个成员函数,必须在类定义中声明,类外实现)。

        

        

        

    文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
      波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
      波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”

  • 相关阅读:
    Jmeter的安装与配置。
    Jemeter学习环境部署。
    将字符串转换为字符数组。
    正则
    将字符串转换为字符数组。
    final,finally,finalize之间的区别。
    Throwable中几个常见方法。
    NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(2)
    SELECT INTO和INSERT INTO SELECT的区别
    NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(1)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3074671.html
Copyright © 2011-2022 走看看