Cpp 友元简述
友元函数,友元类
使用友元,主要是易于直接访问数据,但友元本质是以破坏封装性为代价。
下例引用于: 《C++程序设计(第2版)》
- 友元声明位置由程序设计者决定,且不受类中public、private、protected权限控制符的影响。
- 友元关系是单向的,即类A是类B的友元,但B不是A的友元。
- 友元关系不具有传递性,即类C是类D的友元,类E是类C的友元,但类E不是类D的友元。
- 友元关系不能被继承。
#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 友元简述的更多相关文章
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- 函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)
// 友元函数和运算符重载的碰撞.cpp : 定义控制台应用程序的入口点. // #include <iostream> using namespace std; template < ...
- C++——友元、异常和其他
一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...
- 模板类之间的友元关系实现Blob和BlobPtr
16.12编写你自己版本的Blob和BlobPtr模板,包含书中未定义的多个const成员. Blob.h(注意,成员函数的声明和定义要放在一个头文件中) /*记住,模板的头文件中通常既包括声明也包括 ...
- C/C++:C++友元类
C++友元类: 正常情况下,一个类是訪问不到还有一个类的私有成员的. 就像以下这个: #include <iostream> class A{ private: int a; public ...
- C++ 友元函数的函数指针
成员函数的指针 讲友元之前先讲普通的成员函数的函数指针 class Std_interface { public: virtual void suspend() = 0; }; // define t ...
- C++抽象编程·运算符重载与友元函数
运算符重载(Operator overloading) 从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型.这种技术称为运算符重载. 例如,字符串类重载+运算符,使其 ...
- C++中友元
一.友元分为两种 1.友元函数 2.友元类 二.解析比较好的博客:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.htm ...
- C++_友元函数
1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护 ...
- 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...
随机推荐
- js高级基础部分
基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 数据类型的分类和判断 主要问题 分类 基本(值)类型 Number ----- 任意数值 -- ...
- perl大小写转换函数uc和lc
$side = uc $attrs[0]; #把attrs[0]转换成大写,然后给side变量赋值. $gender = lc $attrs[1]; #把attrs[1]转换成小写,然后给gender ...
- 树莓派(香橙派)通过.NET IoT 操作SPI编写屏幕驱动 顺手做个四足机器人(一)
摘要 这片文章主要是记录自己的整活过程,涉及到的技术包括.NET IoT, .NET Web, .NET MAUI,框架采用的也是最新的.NET 7. 本人是用的树莓派Zero 2 W(ubuntu- ...
- i春秋include
打开题目,发现它提示我们有个phpinfo.php,所以我们直接访问,没有什么特殊的发现,根据题目提示include,找到allow_url_include的信息 (ctrl+f直接进入网页搜索) 发 ...
- vue3 + element plus 使用字节跳动图标
使用场景: 提一下vue2 用法>> 下面回到正题 vue3 用法 1 安装包: npm install @icon-park/vue-next --save 2 字节跳动图标库取图地 ...
- 基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理实现
1.基础环境:Centos7.9,kubernetes:v1.21.5 node-1@112(master):docker,containerd,harbornginx(80),git,etcd no ...
- 【大数据面试】Flink 02 基本操作:入门案例、Env、Source、Transform、数据类型、UDF、Sink
二.基本操作 1.入门案例 (1)批处理wordcount--DataSet val env = ExecutionEnvironment.getExecutionEnvironment // 从文件 ...
- go操作Kfaka
目录 1. Kafka介绍 1.1.1. Kafka是什么 1.1.2. Kafka的特点 1.1.3. 常用的场景 1.1.4. Kafka中包含以下基础概念 1.1.5. 消息 1.1.6. 消息 ...
- Jvm上如何运行其他语言?JSR223规范最详细讲解
一 在Java的平台里,其实是可以执行其他的语言的.包括且不仅限于jvm发展出来的语言. 有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具一应俱全,放着 ...
- DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead
// 引入mongoose模块 const mongoose = require('mongoose'); // 链接数据库 mongoose.set('useCreateIndex', true) ...