zoukankan      html  css  js  c++  java
  • 友元

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

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

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

    友元类

    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

  • 相关阅读:
    爬虫模块BeautifulSoup
    移动端开发概览【webview和touch事件】
    实战JS正则表达式
    相识HTML5 canvas
    运算符中的一些小技巧
    再看Ajax
    跨终端开发必备概念汇总
    谈谈工作,聊聊生活,想想以后
    页面元素坐标和偏移(clientX/pageX/screenX/layerX/offsetWidth/scrollWidth/clientWidth等)相关整理
    CSS3 Flexbox不迷路指南
  • 原文地址:https://www.cnblogs.com/helloforworld/p/5652837.html
Copyright © 2011-2022 走看看