zoukankan      html  css  js  c++  java
  • 【c++】友元

    c++引入友元的原因

    在某些情况下,允许特定的非成员函数访问类的私有成员。在类中以关键字friend开始(只能出现在类定义的内部),声明为友元的可以为类、类的成员函数、普通的非成员函数。

    速览

    #include <iostream>
    #include <string>
    using namespace std;
    
    class b;
    class f 
    {
        friend b;
        public:
            void print_a() { cout << "hello 2013" << endl; }
        private:
            void print_v() { cout << "hello 2014" << endl; }
    };
    
    class b
    {
        public:
            void print_b(f ff)
            {
                ff.print_a();
                ff.print_v();
            }
    };
    
    int main()
    {
        f ff;
        b bb;
        bb.print_b(ff);
    
    }
    View Code

    一个具体的例子

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Sales_item;
    class A {
        public: 
            void fuc(Sales_item &);
    };
    
    class Sales_item
    {
        public:
            Sales_item(const string &s = ""): isbn(s){};
            friend void A::fuc(Sales_item&);        
            friend class B;
            friend void fuc(Sales_item&);
        private:
            string isbn;
    };
    void A::fuc(Sales_item &s) 
            {cout << "A:" <<  s.isbn << endl;}
    class B
    {
        public: 
            void fuc(Sales_item &item)
            {
                cout << "B:" << item.isbn << endl;
            }
    };
    void fuc(Sales_item &s)
    {
        cout << "fuc:" << s.isbn << endl;
    }
    int main()
    {
        string sval = "abc123";
        Sales_item s(sval);
        A a;
        a.fuc(s);
    
        B b;
        b.fuc(s);
    
        fuc(s);
    }

    分析
    类Sales_item中有个私有成员变量isbn,本来只有通过本类的成员函数可以访问。但是利用友元的机制就可以访问到类的私有成员变量。代码中利用了三种方式:类的成员函数普通的非成员函数

    注意细节

    1. 利用类的成员函数访问时。类A必须在Sales_item先定义,而A中的函数A::fuc()的定义必须在Sales_item后定义。

    2. 在1中类A必须在Sales_item先定义,会出现Sales_item未定义错误,此时必须在A之前声明一下。

    3. Sales_item(const string &s = ""): isbn(s){};  这样,如果形参为引用(或指针),那么只能用列表初始化,而不能用函数体。原因是引用必须马上初始化,如果在函数体内的话,还必须改变引用关联的对象,是不允许的。

    4. Sales_item(const string &s = ""): 初始化为“”的话,必须为const,因为不希望通过构造函数改变改变初始值。(尚未完全弄懂,求高人指点

    5. Sales_item(string &s ): 这样的引用。在主函数中这样定义是错误的:Sales_item a("abc");因为“abc"被认为是const对象,是不容许更改的,二传到函数中s是可以改变的。因此如果不希望改变所传的实参的话,最好把函数引用声明为const(否则,会缩小函数的应用范围——不能传递字面值,只可以传递变量名)。因此最好改为Sales_item(const string &s)

  • 相关阅读:
    JS字符串去重
    svn回退到某一版本
    WebStorm格式化代码4个空格设置
    DevExpress中 的DataGrid每一行根据其类型显示控件的种类
    各大系统刷新DNS缓存方法
    Kali Linux中前十名的Wifi攻击工具
    CentOS远程执行漏洞
    判断是否移动端的几种方法
    笔记
    Linux常用命令
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3241765.html
Copyright © 2011-2022 走看看