C++学习笔记-友元理论详解
2016-08-30 19:24
218 查看
友元、友元类、友元函数知识点总结
由于有了类这样的机制,实现了数据的隐藏和封装,也就是说累的一般成员被定义为私有成员,成员函数一般被定义为公有的,
类内部的成员函数可以访问类中的私有成员,这样就实现了数据的隐藏。但是这样出现了一个问题,有时候需要定义
一个类外部的函数,但是这个函数又需要经常的访问类中的数据成员,这时候将这些函数定义为该函数的友元函数,就能够实
现非类内部的函数访问类中的私有成员。
友元实现了外部函数可以访问类内部私有成员的目的,但是它破坏了类的封装性和隐藏性。
那么这样更加灵活的方式是程序员在工程中根据需要而选择使用的。
所以没有一个规则是完美的,只有用在和合适的地方规则才是最贴切的。
{
MainWindow *p;
void friend showwindow(mywindow *pwin)
{
pwin->p = new MainWindow;
pwin->p->show();
}
};
{
MainWindow *p;
void friend showwindow(mywindow *pwin);
};
void showwindow(mywindow *pwin)
{
pwin->p = new MainWindow;
pwin->p->show();
}
2)、一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
2)、友元函数的调用与一般函数的调用方式和原理一致。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
例如,以下语句说明类B是类A的友元类:
class A
{
…
public:
friend class B;
…
};
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。
参考:http://blog.csdn.net/adriano119/article/details/5914443
1、什么是友元?
由于有了类这样的机制,实现了数据的隐藏和封装,也就是说累的一般成员被定义为私有成员,成员函数一般被定义为公有的,
类内部的成员函数可以访问类中的私有成员,这样就实现了数据的隐藏。但是这样出现了一个问题,有时候需要定义
一个类外部的函数,但是这个函数又需要经常的访问类中的数据成员,这时候将这些函数定义为该函数的友元函数,就能够实
现非类内部的函数访问类中的私有成员。
友元实现了外部函数可以访问类内部私有成员的目的,但是它破坏了类的封装性和隐藏性。
那么这样更加灵活的方式是程序员在工程中根据需要而选择使用的。
所以没有一个规则是完美的,只有用在和合适的地方规则才是最贴切的。
2、友元函数
//友元函数可以访问类的私有变量,也可以访问私有函数2.1、直接定义在类的内部
class mywindow{
MainWindow *p;
void friend showwindow(mywindow *pwin)
{
pwin->p = new MainWindow;
pwin->p->show();
}
};
2.2、 声明在类的内部,需要加上friend,定义在类的外部,不需要加上friend
class mywindow{
MainWindow *p;
void friend showwindow(mywindow *pwin);
};
void showwindow(mywindow *pwin)
{
pwin->p = new MainWindow;
pwin->p->show();
}
注意:
1)、友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。2)、一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
2)、友元函数的调用与一般函数的调用方式和原理一致。
3、友元类
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
例如,以下语句说明类B是类A的友元类:
class A
{
…
public:
friend class B;
…
};
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
友元的优点:
使得累的封装这个密不透风的墙,有了条件性的通道——在友元情况下,可以访问这面墙内部的私有成员;友元的缺点:
破坏了封装性;思想方法:
如果将类的封装比喻成一堵墙的话,那么友元机制就像墙上了开了一个门,那些得到允许的类或函数允许通过这个门访问一般的类或者函数无法访问的私有属性和方法。友元机制使类的封装性得到消弱,所以使用时一定要慎重。
参考:http://blog.csdn.net/adriano119/article/details/5914443
相关文章推荐
- C++ FAQ学习笔记 14 章 友元
- c++学习笔记之友元
- C++之友元学习笔记
- C++学习笔记--尴尬友元
- c++学习笔记之类模板中的友元声明
- C++学习笔记46——友元与继承
- C++学习笔记——Mat类详解及元素的遍历方法
- 《C++ Primer Plus》15.1 友元 学习笔记
- C++学习笔记之pimpl用法详解
- 嵌入式开发之C++基础学习笔记5--静态成员,友元,运算符重载,模板,文件流
- c++学习笔记之c++作用域详解
- [C++学习笔记]--友元、this指针
- C++学习笔记之vector类详解
- 《C++ Primer Plus》第15章 友元、异常和其他 学习笔记
- (c/c++学习笔记十二)const详解
- 【C++】【学习笔记】【020】友元
- C++学习笔记33——友元
- C++学习笔记(2)----类模板和友元
- C++学习笔记(2)之引用详解
- C++之操作符重载和友元学习笔记