友元就是允许其他类或函数访问类的非公有成员,打破了类的封装性,友元属性用friend来修饰

1.友元与函数

class friendclass
{friend void seeprivatefunc();
public:friendclass(){}~friendclass(){}private:int a;int b;
};void seeprivatefunc()
{friendclass fc;fc.a=10;fc.b=20;cout<<fc.a<<fc.b<<endl;
}int main(int argc, char const *argv[])
{seeprivatefunc();return 0;
}

上述代码将函数seeprivatefunc声明为友元,所以seeprivatefunc可以访问friendclass对象的私有变量,如果去掉friend,会出现访问权限的错误

2.友元与类

一个类可以是另一个类的友元类

class friendclass
{friend class friendclass2;//友元类
public:friendclass():a(5),b(10){}~friendclass(){}private:int a;int b;
};class friendclass2
{
public:friendclass2(){}~friendclass2(){}void func(const friendclass &t);
};void friendclass2::func(const friendclass &t)
{cout<<t.a<<t.b<<endl;
}int main(int argc, char const *argv[])
{friendclass t1;friendclass2 t2;t2.func(t1);return 0;
}

friendclass2是friendclass的友元类,所以,friendclass2可以访问friendclass的非公有成员,因此void friendclass2::func(const friendclass &t)能成功打印a和b

一个类的成员函数也可以是另一个类的友元函数

上述代码还可以换一种写法,将friendclass2的成员函数func作为friendclass的友元,直接在func中就可以访问a和b

class friendclass2
{
public:friendclass2(){}~friendclass2(){}void func();
};class friendclass
{friend void friendclass2::func();
public:friendclass():a(5),b(10){}~friendclass(){}private:int a;int b;
};void friendclass2::func()
{friendclass t;cout<<t.a<<t.b<<endl;
}int main(int argc, char const *argv[])
{friendclass2 t2;t2.func();return 0;
}

上述代码friendclass和friendclass2的位置变化了,friendclass2在前,因为friendclass中声明的友元必须得能被编译器找到,如果friendclass2在后面,会报错

提示无法找到friend void friendclass2::func();的声明

类的声明

可以把类的定义和声明分开,就就像函数的定义和声明分开,出现类的声明意味着只知道有一个这样名字的类,但是类里面的成员还是不清楚,也就是说,此时的类不完整,所以定义该类的指针

int main(int argc, char const *argv[])
{class a;a *p=nullptr;return 0;
}

上述代码可以编译通过,但是不能对a的对象进行初始化,因为a是不完整的,只能定义指针

几乎所有的代码都是将类的声明放在头文件中,然后将该类的指针作为其他类的成员,上述代码只是为了演示

类直到被定义完成时,才能产生对象,在定义完成之前,类也是不完整的,所以,类的定义不能包含自身,但是可以包含自身的指针

class p
{p t;
};

参考:

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点13——友元,类的声明相关推荐

  1. C++中友元类使用场合

    在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员.与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员. 声明友元类的方法很简单,只需在类中写 ...

  2. 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )

    文章目录 成员函数 常量函数 友元函数 new 创建对象 友元类 单例类 成员函数 此处继续上一篇博客继续向后讲解C++面向对象 类成员方法 , 除了定义构造方法与析构方法之外 , 还可以定义普通的成 ...

  3. 友元实例:友元类及友元函数

    学习了c++这么久,一直没有对友元进行了解,据说友元不是特别好用(据说,不是我说的),因此直到今天才去了解.其实友元确实不是很常用,但友元功能确实很实用,它不但能够释放类中的非公有成员,同时还能保证了 ...

  4. C++友元:友元函数、友元类和友元成员函数

    Table of Contents 1.友元函数 2.友元类 3.友元成员函数 友元小结: 参考资料: 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例 ...

  5. 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  6. c语言friend函数,C++ friend友元函数和友元类

    友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...

  7. C++学习1:C++友元函数和友元类

    前言 类中的成员通过权限控制符实现了数据的封装,若对象要访问类中的私有数据,则只能通过成员函数实现.这种方式实现了数据的封装却增加了开销,有时候需要通过外部函数或类直接访问其他类的私有成员,为此C++ ...

  8. java友元类_友元实例:友元类及友元函数

    学习了c++这么久,一直没有对友元进行了解,据说友元不是特别好用(据说,不是我说的),因此直到今天才去了解.其实友元确实不是很常用,但友元功能确实很实用,它不但能够释放类中的非公有成员,同时还能保证了 ...

  9. C++_类和对象_对象特性_友元_友元类_在一个类中声明另一类作为自己的友元类_可以访问自己类中的private变量---C++语言工作笔记053

    然后我们再来一个去看看友元类,用类来做友元,上面我们说的是全局函数做友元. 首先我们先去写一个类叫GooGay好基友. 然后里面去定义一个成员变量,这个成员变量可以看到类型是 Building这个类, ...

最新文章

  1. 查看mysql的编码格式
  2. 盘点:2020年最酷的12家机器学习初创公司
  3. 微软成功测试氢燃料电池,为数据中心连续供电 48 小时
  4. CSS设置图片的重复
  5. yolo yolov2_PP-YOLO超越YOLOv4 —对象检测的进步
  6. 3.3-3.9 周记
  7. 【牛客 - 303B第十五届浙江大学宁波理工学院程序设计大赛(同步赛)】Fibonacci and Counting(Fib数性质,gcd辗转相除法性质)
  8. 【opencv学习】【图像的阈值处理】
  9. Google Colab使用学习笔记
  10. html 边框轮廓,CSS Outline(轮廓)
  11. html框架之间空隙,Span之间空隙原因和解决办法
  12. [Chatter] 为甚么要学Design Pattern
  13. 一个事物两个方面的对比举例_象征和体现这两个词的区别  最好举例子说明,谢谢啦...
  14. Python sklearn 分类效果评估
  15. 多点触摸画板(MultiTouchCanvas)
  16. 江在川上曰:JS函数
  17. 高斯混合模型(GMM)实现和可视化
  18. [乐意黎原创]访问Centos下Apache主机页面抛You don't have permission to access / on this server.
  19. ***无人驾驶***整理的apollo 入门课程
  20. 实验六 基于MATLAB的IIR数字滤波器设计

热门文章

  1. 7个杀手级的开源监测工具
  2. 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获
  3. SQL Server 2012笔记分享-48:备份时间线
  4. 计算机网络——数据通信过程
  5. 验证视图MAC失败 Validation of ViewState MAC Failed
  6. 在ASP.NET应用程序中捕捉身份验证状态的变化
  7. matlab学习——1.基本操作
  8. UOJ37. 【清华集训2014】主旋律
  9. Python实用笔记 (16)函数式编程——偏函数
  10. 线程状态以及sleep yield wait join方法