首页 > 其他分享 >Cpp 友元简述

Cpp 友元简述

时间:2022-09-25 15:24:44浏览次数:39  
标签:友元 即类 void private date 简述 Cpp class

友元函数,友元类

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

下例引用于: 《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;
}


标签:友元,即类,void,private,date,简述,Cpp,class
From: https://www.cnblogs.com/pphboy/p/16727912.html

相关文章

  • cpp无法进行参数推断的情况
    template<typenamet1,typenamet2>voidfoo(typenamestd::is_class<t1>::typep1,typenamestd::is_class<t2>::typep2){...}这种函数是无法进行参数推断的,因为......
  • 反射(简述)
    反射反射:将类中的各个组成部分封装为其他对象,这就是反射机制反射是框架设计的灵魂获取class对象的方式Class.forName("全类名")类名.class对象.getClassPerson类......
  • Typescript学习之路(2) - 类型简述
    什么是强类型语言/弱类型语言?强类型语言老式定义:在强类型语言中,当一个对象从调用函数传递到被调用函数时,其类型必须与被调用函数中声明的类型兼容。A(){B(x)}B......
  • Unity打IL2cpp(armv7+arm64)包黑屏的处理方法
     处理方法:删掉Library/Il2cppBuildCache文件夹再打包就行了出现黑屏的前提是之前打过IL2CPP(armv7或arm64)包后再打IL2CPP(armv7+arm64),这个应该是属于unity的锅,unity版......
  • 项目简述2
     前后端分离 ......
  • NeoVim插件之CPP助手
    简介插件地址:cppassist.nvim该插件是我自己根据ourobors.nvim插件所写的一款类似于VAssistX的助手插件。细节使用正则表达式而不是LSP来查找源文件;可以识别......
  • 友元类
       一个类A可以将另一个类B声明为自己的友元,类B的所有成员函数就都可以访问类A对象的私有成员。在类定义中声明友元类的写法如下:       friend clas......
  • cpp和c中struct用法的区别
    cpp和c中struct用法的区别c中的struct不使用typedefC语言中,定义struct的语法如下:struct[<tag>]{<member-list><member-list><member-list>.........
  • 4. 简述redis集群的实现原理
    4. 简述redis集群的实现原理  4.1RedisCluster工作原理 在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以......
  • 1、简述redis特点及其应用场景
    1、简述redis特点及其应用场景 1.1redis特点速度快:10WQPS,基于内存,C语言实现单线程持久化支持多种数据结构支持多种编程语言功能丰富:支持Lua脚本,发布订阅......