第28课 友元的尴尬能力

1. 友元的概念

(1)友元是C++中的一种关系,友元关系发生在函数与类之间或类与类之间

(2)友元关系是单项的,不能传递

class Point
{
    double x;
    double y;
    friend void func(Point& p);//声明func为Point类的友元函数
}

void func(Point& p){};//在这个函数中,可以访问Point类内的任何成员!

2. 友元的用法

(1)在类中以friend关键字声明友元

(2)类的友元可以是其它类或者具体函数

(3)友元不是类的一部分,也不受类中访问级别的限制,可以直接访问具体类的所有成员

(4)用友元的注意事项

  ①友元关系不具备传递性

  ②类的友元可以是其它类的成员函数(即其它内的成员函数作为该类的友元函数

  ③类的友元可以是某个完整的类(即所有的成员函数都是友元)

【编程实验】友元的使用初探

#include <stdio.h>
#include <math.h>

class Point
{
private:
    double x;
    double y;

public:
    Point(double x, double y)
    {
        this->x = x;
        this->y = y;
    }

    double getX(){return x;}
    double getY(){return y;}

    void getXY()
    {
        printf("x = %f, y = %f\n", x, y);
    }

    friend double Distance(Point& p1, Point& p2);
};

//从这里看,Distance只是一个普通的函数
double Distance(Point& p1, Point& p2)
{
     double ret = 0;
     ret=sqrt((p2.x-p1.x)*(p2.x-p1.x) +
              (p2.y-p1.y)*(p2.y-p1.y));//可以引用类中的私有成员!
     return ret;
}
int main()
{
    Point p1(1, 2);
    Point p2(10, 20);

    p1.getXY();
    p2.getXY();

    printf("|(p1, p2)| = %f\n", Distance(p1, p2));

    return 0;
}

3. 友元的尴尬

(1)友元是为了兼顾C语言的高效而诞生的,但直接破坏了面向对象的封装性

(2)友元在实际产品中的高效是得不偿失的,在现代软件工程中己经逐渐被遗弃

【编程实验】友元的深入分析

4. 小结

(1)友元是为了兼顾C语言的高效而诞生的

(2)友元直接破坏了面向对象的封装性

(3)友元关系不具备传递性

(4)类的友元可以是其它类的成员函数

(5)类的友元可以是某个完整的类

时间: 2024-10-14 04:25:07

第28课 友元的尴尬能力的相关文章

第四课 产品经理的能力知识结构1 - 自我管理能力

4.1 产品经理的自我管理能力 ● 4.1.1 习惯,是一个人一生的财富 - 习惯的养成,一部分来自生活的磨砺,另一部分,则来自对自己的自我管理. ● 4.1.2 你的工作角色,决定了你的生活方式 - 如果你是: ▲ 艺术家(采风,找感觉,心灵的释放) ▲ 摇滚歌星(情绪的释放,对生命的呐喊,疯狂奇遇的人生) ▲ 自由工作者(相对自由)   ▲ 这些工作职业对自我管理要求不高(注意不是没有) ● 4.1.2 你的工作角色,决定了你的生活方式 - 如果你是: ▲ 艺术家(采风,找感觉,心灵的释放)

第28课:声音和控制

声音 呵呵,是不是注意到了批处理没有声音呐?闲话不说,直接做实验吧 ^_^ =============================================== @echo off echo 做好准备,响了啊!! pause cls echo echo 怎么样?呵呵,刺激吧~ pause cls mshta vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!

第28课 指针和数组分析(上)

1. 数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 [编程实验]a + 1的结果是什么?  (答案是第2个元素的地址) #include <stdio.h> int main(){ //将数组每个元素初始化为0 int a[5] = {0}; int* p = NULL; printf("a = 0x%X\n",(unsigned int)(a)

安卓学习第28课——DatePicker、TimePicker

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation

第28课 再论智能指针(下)

1. SharedPointer的设计 (1)使用类模板,通过计数机制标识堆内存 (2)堆内存被指向时,refCount++ (3)指针被置空时:refCount- (4)当refCount == 0时,释放堆内存 2. 计数机制原理剖析 3. SharedPointer类的声明 template <typename T> class SharedPointer : public Pointer<T> { protected: int m_refCount; //计数机制成员 pu

[Spark内核] 第35课:打通 Spark 系统运行内幕机制循环流程

本课主题 打通 Spark 系统运行内幕机制循环流程 引言 通过 DAGScheduelr 面向整个 Job,然后划分成不同的 Stage,Stage 是從后往前划分的,执行的时候是從前往后执行的,每个 Stage 内部有一系列任務,前面有分享過,任务是并行计算啦,这是并行计算的逻辑是完全相同的,只不过是处理的数据不同而已,DAGScheduler 会以 TaskSet 的方式把我们一个 DAG 构造的 Stage 中的所有任务提交给底层的调度器 TaskScheduler,TaskSchedu

1月5日完成第22课,准备开始第17课

今天总算把第22课,nagios的第二部分视频看完了.3个月的时间,实在超出我的预期:之前的21课.28课,可以说是一课比一课超出我的预期.22课还比21课少半小时的视频时长,可是,学习的进度实在太慢了. 不断"挑战"自己的容忍限度,可是对自己又没有什么办法. 后天下班回来,计划开始第17课(如果明天能早起,说不定可以从明天开始.对了,后天下班回来,我还想完成51cto学院里,oldboy组织的一次运维职场发展的课程里的1节视频:"到底做运维还是做开发-听听专家的意见&quo

一课|IT培训机构:网络招生这几大套路你还不知道?

一课是一个专注于教育培训垂直领域的信息服务与解决方案的综合平台. “一课”力图通过自有的超级获客能力,同时结合课程分期.在线教务.大数据分析等服务,旨在解决培训机构获客成本高.转化率低的问题. “一课”致力于成为培训行业的“大众点评”,做“互联网+培训”的领导者. 随着互联网行业的兴起,IT培训机构也迎来了爆发式增长,各大城市培训机构数量甚至可以用千来计算,面对如此水深火热的竞争,培训学校必定会想法设法的推广自己,以保证自己能够发展下去. IT培训机构:网络招生这几大套路你还不知道? 所以招生就

第0课 - 数据结构引言

第0课 - 课程目标(实现一个轻量级STL) 第1课 - 进阶高手的大门 第2课 - 数据的艺术 第3课 - 初识程序的灵魂 第4课 - 程序灵魂的审判 第5课 - 算法的时间复杂度 第6课 - 算法效率的度量 第7课 - 课程学习小问答 第8课 - 泛型编程简介 第9课 - 智能指针示例 第10课 - C++异常简介 第11课 - 异常类构建 第12课 - 顶层父类的创建 第13课 - 类族结构的进化 第14课 - 线性表的本质和操作 第15课 - 线性表的顺序存储结构 第16课 - 顺序存储