友元

私有成员只有在类的成员函数内部被访问到。一个类的友元函数可以访问该类的私有成员。

友元函数也可以为全局函数

可以将一个类的成员函数(包括构造、析构函数)声明成另一个类的友元函数。但是,必须先定义包含成员函数的类,才能将成员函数设为友元。友元类也一样,要先定义后声明为友元类。

友元类

B是A的友元类,那么B的成员函数可以通过对象名访问A的私有成员。注意:友元类之间的关系不能传递,不能继承。也就是说基类有友类函数和友元类,它们能访问基类任何成员,而不能访问由这个基类继承的派生类的任何成员。

友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。在A类的类体中用以下语句声明B类为其友元类:

friend B;

在实际开发中除非确有必要,一般不把一个类声明为另一个类的友元类,这样更加安全。

代码如下:
#include <iostream>

using namespace std;

class Engine;
class tyer
{
private:
    int width, length;
public:
    tyer(int w, int l) :width(w), length(l)
    {
        cout << "tyer constructor is called" << endl;
    };
    void printP(Engine en);
    ~tyer()
    {
        cout << "tyer destructor is called" << endl;
    }
};

class Engine
{
private:
    int price;
public:
    Engine(int p)
    {
        price = p;
        cout << "Engine constructor is called" << endl;
    }
    friend void PrintPrice(Engine car1);
    friend void tyer::printP(Engine en);
    ~Engine()
    {
        cout << "Engine deconstructor is called" << endl;
    }
};
void tyer::printP(Engine en)
{
    cout << "the friendly function of tyer is called ";
    cout << en.price << endl;
}
void PrintPrice(Engine car1)
{
    cout << "The price of the car is :";
    cout << car1.price << endl;
}

class car
{
private :
    tyer ty;
    Engine en;
    int color;
public:
    car(int col, int p, int w, int l);
    ~car()
    {
        cout << "car deconstructor is called" << endl;
    }
};
car::car(int col, int p, int w, int l) :color(col), en(p), ty(w, l)
{
    cout << "car constructor is called" << endl;
}

int main()
{
    car car1(2, 1, 4, 5);
    tyer ty1(6, 3);
    Engine en1(180000);
    PrintPrice(en1);
    ty1.printP(en1);
    return 0;
}

 

 参考链接:

https://www.coursera.org/learn/cpp-chengxu-sheji

posted @ 2016-07-08 11:34  helloforworld  阅读(304)  评论(0编辑  收藏  举报