友元函数,友元类

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

下例引用于: 《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. .NET应用开发之SQLServer常见问题分析

    日常我们开发.NET应用时会使用SQLServer数据库,对于SQLServer数据库的日常开发有一些技能和工具,准备给大家分享一下. 一.场景1:SQLServer死锁分析  执行以下SQL,启用S ...

  2. 镜像制作工具diskimage-builder介绍

    简介 diskimage-builder(简称dib)是一款用于构建系统镜像的工具,它被设计用于OpenStack的TripleO项目,支持qocw2.vhd.raw等主流镜像格式. 在众多系统镜像构 ...

  3. nsenter命令简介

    nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令.它位于util-linux包中. 用途 一个最典型的用途就是进入容器的网络命令空间.相当多的容器为了轻量级,是不包含较为基础的命令 ...

  4. 4.drf-版本管理

    根据RESTful规范,后端API中需要体现出版本,DRF中支持5种版本的设置,常见的三种如下 1. URL的GET中传递参数 在视图类中定义 from rest_framework.versioni ...

  5. 初学RNN

    FNN 定义 FNN(Feedforward Neural Network),即前馈神经网络,它是网络信息单向传递的一种神经网络,数据由输入层开始输入,依次流入隐藏层各层神经元,最终由输出层输出.其当 ...

  6. Day24.1:抽象类的详解

    抽象类 1.1抽象类概述 一个动物类中,我们创建对象时会去new一个动物:但是我们不应该直接创建动物这个对象,因为动物本身就是抽象的,没有动物这种实例,我们创建的应该是一个具体的动物类,比如猫.狗等动 ...

  7. 使用selenium爬取淘宝

    一.出现的问题 前段时间在使用selenium对淘宝进行模拟登陆的时候,输入完正好和密码,然后验证码无论如何都不能划过去.找了好久,原来是因为selenium在浏览器中运        行的时候会暴露 ...

  8. vba 数组判断与转换

    Private Function CountArr(arr)'*****************************'计算数组是几维数组'***************************** ...

  9. day01-家具网购项目说明

    家具网购项目说明 1.项目前置技术 Java基础 正则表达式 Mysql JDBC 数据库连接池技术 满汉楼项目(包括框架图) JavaWeb 2.相关说明 这里先使用原生的servlet/过滤器,后 ...

  10. MySQL简介、下载、密码修改及基本使用

    目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 MySQL简介 MySQL基本使用 系统服务的制作 密码相关操作 SQL与NoSQL 数据库重要概念 基本SQL语句 存取数据的演 ...