精华内容
参与话题
问答
  • C++友元函数

    2017-02-08 20:18:04
    C++友元函数
    #include <cmath>
    #include <iostream>
    using namespace std;
    class Point
    {
    public:
    	Point(double xx,double yy)
    	{
    		x=xx;
    		y=yy;
    	}
    	void GetXY() const;
    	friend double Distance(const Point& a,const Point& b);
    	// 运算符重载
    	friend ostream& operator<< (ostream& os,const Point& p);
    private:
    	double x,y;
    };
    void Point::GetXY() const
    {
    	cout<<"("<<x<<","<<y<<")"<<endl;
    }
    double Distance(const Point& a,const Point& b) // 注意函数名前未加类声明符
    {
    	double length;
    	// 它可以引用类中的私有成员
    	length=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    	return length;
    }
    ostream& operator<< (ostream& os,const Point& p)
    {
    	return 	os<<"("<<p.x<<","<<p.y<<")";
    }
    
    int main(void)
    {
    	Point p1(3.0,4.0),p2(6.0,8.0);
    	// 成员函数的调用方法,通过使用对象来调用
    	p1.GetXY();
    	p2.GetXY();
    	// 运算符重载
    	cout<<p1<<endl;
    	cout<<p2<<endl;
    	// 友元函数的调用方法,同普通函数的调用一样,不要像成员函数那样调用
    	double d = Distance(p1,p2);
    	cout<<d<<endl;
    	system("pause");
    	return 0;
    }

    展开全文
  • C++ 友元函数

    2018-05-06 20:32:09
    C++ 友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。 友元可以是一个函数,该函数...

    C++ 友元函数

    类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
    友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
    如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:
    class Box
    {
    double width;
    public:
    double length;
    friend void printWidth( Box box );
    void setWidth( double wid );
    };
    声明类 ClassTwo 的所有成员函数作为类 ClassOne 的友元,需要在类 ClassOne 的定义中放置如下声明:
    friend class ClassTwo;
    请看下面的程序:

    #include <iostream>
    
    using namespace std;
    
    class Box
    {
       double width;
    public:
       friend void printWidth( Box box );
    friend写在前面
    
       void setWidth( double wid );
    };
    
    // 成员函数定义
    void Box::setWidth( double wid )
    {
        width = wid;
    }
    
    // 请注意:printWidth() 不是任何类的成员函数
    void printWidth( Box box )
    {
       /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
       cout << "Width of box : " << box.width <<endl;
    }
    
    // 程序的主函数
    int main( )
    {
       Box box;
    
       // 使用成员函数设置宽度
       box.setWidth(10.0);
    
       // 使用友元函数输出宽度
       printWidth( box );
    
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:
    Width of box : 10

    展开全文
  • c++ 友元函数

    2020-04-23 10:13:18
    尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。 如果要...

    定义

    类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

    友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

    如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:

    题目:

    定义Boat和Car两个类,二者都有一个weight属性,定义它们的一个友元函数totalWeight( ),计算二者的重量和。

    代码如下:

    #include <iostream>
    #include <string.h>
    #include <map>
    #include<queue>
    #include<unordered_map>
    using namespace std;
    #pragma warning(disable:4996)
    
    class Car;//先声明
    
    /*boat类*/
    class Boat {
    	int weight;
    public:
    	void setWeight(int setwei);
    	int getWeight();
    	friend int totalWeight(Boat boat, Car car);
    };
    // 成员函数定义
    void Boat::setWeight(int setwei) {
    	weight = setwei;
    }
    // 成员函数定义
    int Boat::getWeight() {
    	return weight;
    };
    
    /*car类*/
    class Car {
    	int weight;
    public:
    	void setWeight(int setwei);
    	int getWeight();
    	friend int totalWeight(Boat boat, Car car);
    };
    // 成员函数定义
    void Car::setWeight(int setwei) {
    	weight = setwei;
    }
    // 成员函数定义
    int Car:: getWeight() {
    	return weight;
    }
    
    /*计算car和boat的总重量,该函数不是任何类的成员函数*/
    int totalWeight(Boat boat,Car car) {
    	return car.weight + boat.weight;
    }
    
    int main() {
    	Boat boat;
    	Car car;
    
    	//使用成员函数设置
    	boat.setWeight(10);
    	car.setWeight(20);
    	
    	cout<<"boat的重量是:"<<boat.getWeight()<<endl;
    	cout<<"car的重量是:"<<car.getWeight()<<endl;
    	//使用友元函数输出
    	cout << "boat与car的总重量:"<<totalWeight(boat,car)<< endl;
    }
    

    结果如下:

    在这里插入图片描述

    展开全文
  • c++友元函数

    2020-08-29 16:49:19
    目录概述知识点友元函数友元类友成员函数 概述        在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯...

    概述

           在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

    知识点

    • 友元关系不能被继承。
    • 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
    • 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的声明
    • 如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得到允许的类或函数允许通过这个门访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。
    • 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都声明为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。
    • 友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但所矛盾的是,即使是最大限度大保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。 在类里声明一个普通数学,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员

    友元函数

    1. 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明
    2. 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
    3. 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
    4. 友元函数的调用与一般函数的调用方式和原理一致。
    class CTestA
    {
    public:
    	CTestA():m_nId(0),m_nAge(0)
    	{}
    
    	friend int Func();//定义为友元函数
    
    private:
    	int m_nId;
    	int m_nAge;
    };
    
    //全局函数
    int Func()
    {
    	CTestA a;
    	return a.m_nId;//可以调用自由成员
    }
    
    int main()
    {
    	int nId = Func();
    	std::cout << nId << std::endl;
    }
    

    友元类

    1. 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
    2. 当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。
    class CTestB
    {
    public:
    	friend class CTestA;//把类CTestA定义为类CTestB的友元类,这样就可以在类CTestA中访问类CTestB中的所有成员变量
    
    private:
    	int m_nId;
    	int m_nAge;
    };
    
    class CTestA
    {
    public:
    	CTestA():m_nId(0),m_nAge(0)
    	{}
    
    	void Show() const
    	{
    		//可以在类CTestA中使用CTestB的所有成员变量
    		CTestB b;
    		b.m_nId = 1;
    		b.m_nAge = 2;
    		std::cout << b.m_nId << std::endl;
    	}
    
    private:
    	int m_nId;
    	int m_nAge;
    };
    
    int main()
    {
    	CTestA a;
    	a.Show();//1
    }
    

    友成员函数

    class CTestB
    {
    public:
    	friend void CTestA::Show();//把类CTestA中的Show函数定义为类CTestB的友元函数,这样在类CTestA的Show函数中就可以访问类CTestB的所有成员
    
    private:
    	int m_nId;
    	int m_nAge;
    };
    
    class CTestA
    {
    public:
    	CTestA() :m_nId(0), m_nAge(0)
    	{}
    
    	void Show();
    
    
    private:
    	int m_nId;
    	int m_nAge;
    };
    
    void CTestA::Show()
    {
    	//可以在类CTestA中使用CTestB的所有成员变量
    	CTestB b;
    	b.m_nId = 1;
    	b.m_nAge = 2;
    	std::cout << b.m_nId << std::endl;
    }
    

    参考文章

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 6,234
精华内容 2,493
关键字:

c++友元函数

c++ 订阅