码迷,mamicode.com
首页 > 编程语言 > 详细

关于c++友元的一些记录

时间:2014-10-02 16:33:13      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   数据   sp   div   问题   c   

友元的主要功能:

   在其他类中 为 class 或者 函数设置friend 前缀声明 可以使其访问其他类中的私有数据.

使用场景:

 1. 当两个对象即不是继承关系 也不是组合关系 但是关系密切到需要访问私有数据时.

 (1) B中所有数据A都可以进行访问.

1 class A {
2 };
3 
4 class B {
5 
6   friend class A;
7 };

 

 (2) 只对部分A中的函数开放.

 1  class B;
 2 
 3 class A {
 4 
 5   void foo(const B& b);
 6 
 7 };
 8 
 9 class B {
10 
11     friend void A::foo(const B& b);
12 
13 };

 调用顺序问题:

  编译器发现  class A 中 foo(const B& b), 所以class B 要在 class A之前声明. 
  编译器发现 A::foo(xx)后先检查class A的声明, 所以class A要在class B之前声明.

  造成循环依赖问题, 所以用B& 作为参数 class B前置声明一下, 可以解决此问题.

  详情请见: c++ primier plus 15章节

 2. 运算符重载中使用友元使参数更加清晰, 提高可读性.

 1 class C {
 2     public:
 3      explicit C(int v) : value(v) {}
 4 
 5      C operator + (int v) {
 6          return C(v + this->value);
 7      }
 8      friend C operator + (const C& c, int v) {
 9          return C(c.value + v);
10      }
11     private:
12     int value;
13 };

 

 3. <C++程序设计语言> 描述:如果希望某个运算的所有运算对象都唔唔允许隐式类型转换,实现它的函数应该作为非成员函数, 取const引用参数或者非引用参数。那些在应用时不需要基础类型的左值的运算符(+,-,|| 等),实现它们的函数常常采用这种方式。这些运算符经常需要访问其运算对象类的内部表示,因此,它们是friend函数的最常见的来源。

使用成员函数的局限是只可以调用当前对象的运算符重载. 如果使用友元可以打破此局限.

 1 class B {
 2     public:
 3         B(int v) : mvB(v) {}
 4         friend B operator + (int a, const B& b) {
 5             return B(a + b.mvB);
 6         }
 7         B operator + (int a) {
 8             return B(this->mvB + a);
 9         }
10     private:
11         int mvB;
12 };
13 
14 
15 B b(2);
16 b = b + 1;   // operator + (int a);  
17 b = 1 + b;   // operator + (int a, const B& b);

 

关于c++友元的一些记录

标签:style   blog   color   使用   数据   sp   div   问题   c   

原文地址:http://www.cnblogs.com/lynnding/p/4004029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!