友元函数,友元类

使用友元,主要是易于直接访问数据,但友元本质是以破坏封装性为代价。

下例引用于: 《C++程序设计(第2版)》

  1. 友元声明位置由程序设计者决定,且不受类中public、private、protected权限控制符的影响。
  2. 友元关系是单向的,即类A是类B的友元,但B不是A的友元。
  3. 友元关系不具有传递性,即类C是类D的友元,类E是类C的友元,但类E不是类D的友元。
  4. 友元关系不能被继承。
#include <iostream>
#include <math.h> using namespace std; // 友元类的例子
class Time{
friend class Circle;
public:
void showDate();
private :
int date;
};
void Time::showDate(){
cout << "date = " << this->date << endl;
} class Point;
class Circle{
// friend void getArea(Circle &circle);
private:
float radius;
const float PI = 3.14;
public:
void setTime(Time &time,int date);
float getArea(Point &p1,Point &p2);
Circle(float radius);
~Circle();
};
void Circle::setTime(Time &time,int date){
time.date = date;
} Circle::Circle(float radius = 0): radius(radius){
cout << "圆的初始化半径为: "<< this->radius << endl;
}
Circle::~Circle(){
cout << "i came,i saw, i conquered"<<endl;
} class Point{
friend float Circle::getArea(Point &p1,Point &p2);
public:
Point(float x,float y);
~Point();
private:
float x;
float y;
};
Point::Point(float x,float y): x(x),y(y){
cout << "初始化坐标" << endl;
}
Point::~Point(){};
// 如果是友元,则可以访问和修改私有成员变量 ,如果不是友元,从其根本上就无法访问私有变量
// void getArea(Circle &circle){
// cout << "圆的半径:" << circle.radius << endl;
// cout <<"圆的面积:" << circle.PI * circle.radius* circle.radius << endl;
// circle.radius = 1;
// cout << "圆的半径:" << circle.radius << endl;
// cout <<"圆的面积:" << circle.PI * circle.radius* circle.radius << endl;
// } // 如果一个类的成员函数被标识为另一个类的友元函数,则这个类的函数,可以通过引用直接访问另一个类的私有属性
float Circle::getArea(Point &p1,Point &p2){
float x = abs(p1.x-p2.x);
float y = abs(p1.y-p2.y);
printf("坐标(%.2f,%.2f)\n",x,y);
float len = sqrtf(x*x+y*y); //求两点之间的距离,这是勾股定理
cout<< "两点之间的距离 : " << len << endl;
return len*len*PI;
} int main(int argc, char *argv[])
{
Circle circle;
Point p1(5,5);
Point p2(10,10);
circle.getArea(p1,p2); // 测试友元类
// 存在 两个 类 A 与 B,如果B内部标识了 friend class A;
// 则A 内部的函数即可通过 B的对象,直接访问B的私有成员
Time time;
circle.setTime(time,666);
time.showDate();
return 0;
}

Cpp 友元简述的更多相关文章

  1. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  2. 函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)

    // 友元函数和运算符重载的碰撞.cpp : 定义控制台应用程序的入口点. // #include <iostream> using namespace std; template < ...

  3. C++——友元、异常和其他

    一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...

  4. 模板类之间的友元关系实现Blob和BlobPtr

    16.12编写你自己版本的Blob和BlobPtr模板,包含书中未定义的多个const成员. Blob.h(注意,成员函数的声明和定义要放在一个头文件中) /*记住,模板的头文件中通常既包括声明也包括 ...

  5. C/C++:C++友元类

    C++友元类: 正常情况下,一个类是訪问不到还有一个类的私有成员的. 就像以下这个: #include <iostream> class A{ private: int a; public ...

  6. C++ 友元函数的函数指针

    成员函数的指针 讲友元之前先讲普通的成员函数的函数指针 class Std_interface { public: virtual void suspend() = 0; }; // define t ...

  7. C++抽象编程·运算符重载与友元函数

    运算符重载(Operator overloading) 从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型.这种技术称为运算符重载. 例如,字符串类重载+运算符,使其 ...

  8. C++中友元

    一.友元分为两种 1.友元函数 2.友元类 二.解析比较好的博客:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.htm ...

  9. C++_友元函数

    1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率       具体来说:为了使其他类的成员函数直接访问该类的私有变量       即:允许外面的类或函数去访问类的私有变量和保护 ...

  10. 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)

    demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...

随机推荐

  1. [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异

    最近做一个C++开源项目发现一个奇怪问题,通过clang编译链接执行程序每到有一个就崩溃了,gcc下则没有此问题. 后来通过调试,发现原因是bool返回的方法是没有return语句!问题是为啥还能通过 ...

  2. dp入门30题

    前言:本文章主要记录一些 \(dp\) 入门题,都是我做过的,希望读者能从这些基础题中打好 \(dp\) 扎实的基础,有不足的地方也欢迎指出.大部分是 \(CodeFoces\) 和 \(Atcode ...

  3. Go语言核心36讲13

    我们已经讨论过了通道的基本操作以及背后的规则.今天,我再来讲讲通道的高级玩法. 首先来说说单向通道.我们在说"通道"的时候指的都是双向通道,即:既可以发也可以收的通道. 所谓单向通 ...

  4. vcenter异常死机无法重启

    esxi主机异常掉电重启后,vcenter启动失败 查阅相关资料发现,一般是由于时间同步异常造成, 推荐方法是先确认bios硬件时间已同步,再删除旧的本地服务json文件,重启vcenter的服务. ...

  5. __init__、__all__

    在python中 引用模块包的时候,要先进入此模块的__init__.py中畅游一遍,因此,我们多次需要一个语句的时候,就可以将这些语句写入到__init__.py中: 在使用*号的时候我们可以用__ ...

  6. 使用SunnyUI的datagridview常用代码(个人常用)

    1.窗体加载时初始化grid private void LayOut() { dgv.Font = new System.Drawing.Font("微软雅黑", 9F); dgv ...

  7. GKCTF2021 MISC

    1.签到 当时没签上┭┮﹏┭┮: 追踪http流,发现依次执行[ls][ls/][whoami] 发现存在[fl4g],同时发现破解的规则为hex decode->base64 decode-& ...

  8. Spring02:注解IOC、DBUtils单表CRUD、与Junit整合

    今日内容:基于注解的IOC及IOC的案例 Spring中IOC的常用注解 案例-使用xml方式和注解方式实现单表的CRUD操作 持久层技术选型:DBUtils 改造基于注解的IOC案例,使用纯注解的方 ...

  9. c++11 线程池--鸿蒙OS

    一个你应该学习的线程池 说明 原理:线程+优先级队列.源码没有涉及STL,没有复杂高深的语法,安全性做得很好: queue的安全使用方式top和pop以及empty的判断都是使用了 std::lock ...

  10. 【深入浅出Spring原理及实战】「源码原理实战」从底层角度去分析研究PropertySourcesPlaceholderConfigurer的原理及实战注入机制

    Spring提供配置解析功能 主要有一下xml文件占位符解析和Java的属性@Value的占位符解析配置这两种场景进行分析和实现解析,如下面两种案例. xml文件的占位符解析配置 <bean i ...