文档章节

C++ 友元类使用 (friend)

o
 osc_mervd488
发布于 2018/04/26 08:10
字数 414
阅读 7
收藏 0
c++

精选30+云产品,助力企业轻松上云!>>>

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\n");
15     }   
16 
17 private:
18     void _inner_print(){
19         printf("A print _inner_print\n");
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("\ncall B1 print\n");
 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("\ncall B2 print\n");
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
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

如何将div放置在其容器的底部? - How can I position my div at the bottom of its container?

问题: Given the following HTML: 鉴于以下HTML: <div id="container"> <!-- Other elements here --> <div id="copyright"> Copyright Foo web designs </div> </div> I would like #cop......

富含淀粉
今天
10
0
unity列表控件Horizontal/Vertical/Grid Layout Group用法介绍

1. Grid Layout Group 为Panel控件添加Grid Layout Group,子控件为四个按钮,分别为Grid,Calendar,Gear,User: 默认属性为 为方便演示,按钮的底色为控件自带image,按钮上面的图标为其子...

路过暴风
今天
19
0
Distinct()与lambda? - Distinct() with lambda?

问题: Right, so I have an enumerable and wish to get distinct values from it. 是的,所以我有一个可枚举的,并希望从中获得不同的值。 Using System.Linq , there's of course an ext......

法国红酒甜
今天
16
0
学习编写编译器[关闭] - Learning to write a compiler [closed]

问题: Preferred languages : C/C++, Java, and Ruby. 首选语言 :C / C ++,Java和Ruby。 I am looking for some helpful books/tutorials on how to write your own compiler simply for......

技术盛宴
今天
17
0
OSChina 周一乱弹 —— 毛巾又怎么样?!我在乎的是大姐姐温柔的怀抱!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《雨 因你而下,于你而止》- Seto 手机党少年们想听歌,请使劲儿戳(这里) @Dan...

小小编辑
今天
48
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部