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 ...
随机推荐
- perl 之 join和 split
转载 perl 之 join和 split
- Revit2021保姆级安装教程
Revit2021 WIN10 64位安装步骤: 1.先使用"百度网盘客户端"下载Revit_2021软件安装包到电脑磁盘里,并解压缩,安装全程需连接网络,然后双击打开Revit_ ...
- python基础(三)装饰器
字典推导式: data_list = ['1 hello','2 world'] result = {item.split(" ")[0]: item.split(" & ...
- HCIE Routing&Switching之MPLS静态LSP配置
前文我们了解了MPLS基础理论部分,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16928096.html:今天我们来聊一聊MPLS静态LSP配置相关话题: ...
- nginx配置文件单独创建和管理
在nginx主配置文件nginx.conf的http模块下引入配置文件夹(注意路径的正确性) 1.nginx主配置文件备份后编辑(nginx配置存放位置:/usr/local/nginx/conf/) ...
- 【Java SE进阶】Day04 Map、Debug
一.Map集合 1.概述 映射 /双列集合 集合分为Collection(存储一个元素 )和Map(存储一对元素) 键不能重复,值可以重复 2.常用子类 HashMap 哈希表存储数据 元素存取数据不 ...
- 【每日一题】【map存值】2022年2月25日-NC112 进制转换
描述给定一个十进制数 M ,以及需要转换的进制数 N .将十进制数 M 转化为 N 进制数. 当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , ...
- gulp4.0构建任务
执行default任务时,依次执行以下任务 gulp.task('default', ['htmlmin', 'cssmin', 'jsmin', 'copy']); 报错:Task function ...
- 用 Java?试试国产轻量的 Solon v1.11.4(带视频)
一个更现代感的 Java 应用开发框架:更快.更小.更自由.没有 Spring,没有 Servlet,没有 JavaEE:独立的轻量生态.主框架仅 0.1 MB. @Controller public ...
- java中的复合赋值运算符
本文主要阐明复合赋值运算符 即 i = i+ 1.2 ==> i += 1.2: int i = 1; i += 1.2; System.out.println(i); // i == 2 注意 ...