标签: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);
标签:style blog color 使用 数据 sp div 问题 c
原文地址:http://www.cnblogs.com/lynnding/p/4004029.html