zoukankan      html  css  js  c++  java
  • C++ 友元类使用 (friend)

    C++中私有变量对外部类是不能直接访问的,也是不能继承的。

    使用友元类可以访问类中的私有方法、私有变量,虽然对类的封装有一定的破坏,但是有时也是很实用的。

    在实际中,在修改已有代码时,为了不大改动已有代码:

    (1) 对于没有继承关系的类,如果有关联,使用友元类还是比较方便的

    (2) 对于有继承关系的类,如果有关联,可以将变量访问由private改为protected。

    直接看代码例子:

    a.h

     1 #include<stdio.h>
     2 //注意: 该类文件中, 不要包含b.h, 否则会报错
     3 
     4 //注意: 由于不是同一个命名空间, 这里申明一下class B2
     5 namespace st1{
     6 namespace st2{
     7 class B2; 
     8 }
     9 }
    10 
    11 class A{
    12 public:
    13     void print(){
    14         printf("A print function
    ");
    15     }   
    16 
    17 private:
    18     void _inner_print(){
    19         printf("A print _inner_print
    ");
    20     }   
    21 
    22     //注意: 申明友元类, 方便两个类中可以直接访问private变量, 函数
    23     friend class B1; 
    24     friend class ::st1::st2::B2;
    25     
    26 };

    b.h

     1 #include "a.h"
     2 
     3 //定义B1
     4 class B1{ 
     5 public:
     6     void print(){
     7         printf("
    call B1 print
    ");
     8         a.print();
     9         a._inner_print();
    10     }   
    11 
    12 private:
    13     A a;    
    14 };
    15 
    16 //定义B2
    17 namespace st1{
    18 namespace st2{
    19 
    20 class B2{ 
    21 public:
    22     void print(){
    23         printf("
    call B2 print
    ");
    24         a.print();
    25         a._inner_print();
    26     }   
    27 
    28 private:
    29     A a;    
    30 };
    31     
    32 }
    33 }

    测试文件main.cpp

     1 #include <stdio.h>
     2 #include "b.h"
     3 
     4 int main(){
     5     B1 b1; 
     6     ::st1::st2::B2 b2; 
     7 
     8     b1.print();
     9     b2.print();
    10     return 0;
    11 }

    输出:

    call B1 print
    A print function
    A print _inner_print
    
    call B2 print
    A print function
    A print _inner_print
  • 相关阅读:
    JavaUtil_04_验证码生成器
    Java微信公众平台开发_02_启用服务器配置
    Log4j2_学习_01_Log4j 2使用教程
    Java_Time_01_获取当前时间
    Eclipse_配置_00_资源帖
    Eclipse_插件_02_jd-eclipse插件的安装
    noip模拟题题解集
    小结:高斯消元
    10月刷题总结
    【vijos】1892 树上的最大匹配(树形dp+计数)
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/8906165.html
Copyright © 2011-2022 走看看