友元函数,友元类

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

下例引用于: 《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. 达梦-DBLINK数据库链接

    aliases: [达梦 DBlink] tags: [数据库,DM,Blog] link: date: 2022-09-06 说明:DM-Oracle指的是在DM中创建链接至Oracle的Dblin ...

  2. JAVA-注解之 TODO、FIXME、XXX

    TODO.FIXME.XXX    //TODO : 表示待实现的功能    //FIXME: 代码存在Bug,不能Run或运行结果不正确,需要修复    //XXX  : 勉强可以工作,但是实现的方 ...

  3. 如何在 .NET MAUI 中加载 json 文件?

    引言: 按core传统方式添加 AddJsonFile("appsettings.json") 在windows平台和ssr工作正常,但是在 ios 和 android 无法用这种 ...

  4. tcp网络交互的理解 以及代码实现

    服务端 import socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind(("127.0. ...

  5. 你认识的C# foreach语法糖,真的是全部吗?

    本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包.foreach.为了便于理解,我重新组织了语言,以倒叙结构行文. 先给大家提炼出一个C#题:观察 ...

  6. Leetcode-SQL学习计划-SQL入门-1527.患某种疾病的患者【regexp正则表达式匹配】

    链接:https://leetcode.cn/problems/patients-with-a-condition/ -- 1527.患某种疾病的患者 -- 链接:https://leetcode.c ...

  7. 【SQL查询】必会的常用函数:条件函数、日期函数、文本函数、窗口函数

    〇.概述 1.内容 选择(双分支.多分支) 一.条件函数 1.计算25岁以上和以下的用户数量 CASE THEN END多分支选择 SELECT (CASE WHEN age>=25 THEN ...

  8. .net core 中 WebApiClientCore的使用

    WebApiClient 接口注册与选项 1 配置文件中配置HttpApiOptions选项 配置示例 "IUserApi": { "HttpHost": &q ...

  9. 动态SQL遇到的问题

    看图 查不出来任何数据 因为判断有问题 修改方法如下:

  10. go-micro v3 rpc服务一次改造经历

    地址:https://github.com/go-micro/go-micro grpc-test-demo:https://gitee.com/jn-shao/go-gmicro-rpc-test. ...