首页 > 代码库 > 关于c++友元的一些记录
关于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++友元的一些记录
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。