码迷,mamicode.com
首页 > 编程语言 > 详细

C++的友元函数学习

时间:2017-10-10 20:43:29      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:数据   mat   cout   nbsp   ret   关系   std   数学   friend   

示例1:使用类本身的友元函数

#include <iostream>
#include <cmath>

using namespace std;

/**
 * 友元函数:友元函数可以存取私有成员、公有成员和保护成员。
 */

//示例1:使用类本身的友元函数
class Point {
private:
    double x,y;

public:
    Point(double a, double b) {
        x = a;
        y = b;
    }

    double getX() {
        return x;
    }

    double getY() {
        return y;
    }

    //声明一个友元函数,函数定义一般在类体之外;它不是类的成员函数
    friend double distance(Point&, Point&);
};

//访问Point类中的私有成员x和y
double distance(Point &p1, Point &p2) {
    double dx = p1.x - p2.x;
    double dy = p1.y - p2.y;
    return sqrt(dx*dx + dy*dy);
}

int main() {
    Point p1(1, 2), p2(3, 4);
    std::cout << distance(p1, p2) << std::endl;
    return 0;
}

 

示例2:将类的成员函数作为友元函数

#include <iostream>

using namespace std;

/*
 * 友元函数
 * 将类的成员函数作为友元函数。声明方式:friend 函数类型 函数所在类名:函数名(参数列表)
 */

class Two;   //先声明类Two,以便One引用Two
class One {
private:
    int x;
 
public:
    One(int a) {
        x = a;
    }

    int getX() {
        return x;
    }

    void func(Two &);  
};

class Two {
private:
    int y;

public:
    Two(int b) {
        y = b;
    }

    int getY() {
        return y;
    }

    //类Two通过friend关键字将类One的成员func声明为友元函数,所以One的对象可以通过
    //函数func访问Two对象的私有成员
    friend void One::func(Two &);
};

//修改two类的私有成员
void One::func(Two &r) {
    r.y = x;
}

int main() {
    /*
        输出结果:
        x:1,y:2
        x:1,y:1
    */
    One one(1);
    Two two(2);
    cout << "x:" << one.getX() << ",y:" << two.getY() << endl;
    one.func(two);
    cout << "x:" << one.getX() << ",y:" << two.getY() << endl;
    return 0;
}

 

示例3:将一个类说明为另一个类的友元

#include <iostream>

using namespace std;

/**
 * 将一个类说明为另一个类的友元
 * 几个注意点:
 * 1.友元关系是不传递的,即当说明类A是类B的友元,类B又是类C的友元,类A却不是类C的友元。
 * 2.当一个要和另一个类协同工作时,使用一个类成为另一个类的友元是很有用的。
 * 3.友元声明与访问控制无关,友元函数在私有区域或者在公有区域进行是没有多大的区别的。
 */
class One;
class Two {
private:
    int y;

public:
    friend class One; //将One说明为Two的友元类,这样的话,One的所有成员函数都是Two的友元函数,可以通过One中的任意一个函数访问two类的私有数据。
};

class One {
private:
    int x;

public:
    One(int a, Two &r, int b) {
        x = a;
        r.y = b;
    }

    void display(Two &r) {
        cout << "x:" << x << ",y:" << r.y << endl;
    }
};

int main() {
    //输出结果:x:1,y:2
    Two twoObj;
    One oneObj(1,  twoObj, 2);
    oneObj.display(twoObj);
    return 0;
}

 

C++的友元函数学习

标签:数据   mat   cout   nbsp   ret   关系   std   数学   friend   

原文地址:http://www.cnblogs.com/luoyunshu/p/7647256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!