• 面向对象实验 ——(三)数据的保护与共享


    C++静态成员和友元成员的理解
    面向对象-数据保护与共享-常模块
    写了一节课 极度卑微

    一、实验目的及要求

    内容:
    (1)定义一个具体的类,要求该类中用到类的静态成员和友元;
    (2)案例要具有一定的实际功能。
    要求:
    (1)理解类的静态成员含义,掌握静态成员的适用场合及使用方法;
    (2)掌握友元函数及友元类的用法;
    (3)记录并分析实验结果,撰写实验报告。

    二、实验过程及实验结果分析

    1.静态成员

    (1)定义
    对于一个类来说,函数成员是所有对象都相同的,数据成员则是各自不同的。如果引入一个新的数据成员,对于所有的对象来说,它的值都是相同的,此时如果再去对每一个对象定义一次此数据成员则显得冗杂,由此,我们引入了静态数据成员。
    根据上一段话,可以大体得出静态成员的定义:是类共有的数据,类的所有成员都维护这一个数据。
    (2)语法:
    static int exnum;///静态数据成员
    (3)存储
    因为静态数据成员是类共有的成员,所以他并不会占用对象的内存空间
    更加有关的了解可以看博客

    (4)初始化
    int A::exnum=0;
    “::”是预作用符,表示后面的操作对象属于哪个类。
    (5)访问
    由于对象具有静态成员访问权,所以我们可以通过对象来访问静态成员
    。但是有时候,我们还没有构造对象,这时候就可以直接通过类名来访问静态成员
    (6)静态函数的调用
    在(5)中我们了解到了有两种访问静态成员的方式,理论上由于静态成员属于类,根据类名直接访问静态成员是可行的,但是由于exnum是私有的数据成员,由于模块的安全性,语法并不支持这种操作。
    这时候我们希望某些函数的调用也不依赖于对象,就可以再引进一个静态函数了,与静态数据成员类似,这一函数也是属于类,由类直接调用。
    语法定义如下:
    在这里插入图片描述
    代码:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    运行结果如下:
    构造函数
    构造函数
    (1,2,3)
    (4,5,6)
    调用函数功能进行成员的输出
    (1,2,3)
    sum=21
    直接操作进行数据成员的输出
    1 2 3 21
    sum=21
    sum=21

    2 .友元函数

    (1) 定义
    如果一个类允许某外部函数具有其成员函数的权限
    即可以直接访问类内成员,那么在该类的定义中应当声明此函数为友元函数
    (2)语法
    friend double MyDistance( MyPoint& pb,MyPoint& pe);
    (3)其他
    如果友元函数时全局函数,直接声明即可
    但如果该友元函数是某个类中的函数,需要加预作用符说明该函数属于哪一类
    (4)友元类
    如果想要一个类里的函数都变为另一个类里的友元函数,
    可以直接逐个把其变为友元函数,但这样显得过于繁杂,
    所以我们也可以将该类变为友元类,语法是先在类前加前向声明,
    再在类内定义说明
    在这里插入图片描述

    代码:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.常模块

    (1)定义:
    出于数据保护与共享,出现了常模块。顾名思义,常模块就是构造后数据不允许变化的模块。
    (2)常数据成员:
    常数据成员:在对象构造后其值不会改变,所以必须在构造时对其进行初始化
    保护机制:任何的函数都无法修改其值
    常函数成员:不允许修改数据成员的一个函数成员
    (3)保护机制:
    常对象的保护机制:
    1.任何函数都无法修改其值
    2.常对象调用函数成员时必须保证该函数没有修改常对象的值
    (4)函数的调用
    由于保护机制,常对象不能调用普通函数
    普通对象可以调用常函数,也能调用普通函数,后者优先
    (5)常引用
    不能通过引用的方式改变对象的值,但是原先的数据是可以改变的
    代码:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    运行结果:

    cnt=0
    构造函数
    cnt=1
    构造函数
    cnt=2
    析构函数
    cnt=1
    构造函数
    常函数
    构造函数
    普通函数
    析构函数
    析构函数
    析构函数

    4.实验代码:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    运行结果:

    point构造函数
    point构造函数
    以下为a的信息:
    x=1
    y=2
    以下为b的信息:
    x=3
    y=4
    总共的数据成员之和为10
    析构函数
    析构函数

    过程分析:

    先是生成两个point对象a,b
    然后打印出a,b的信息
    调用友元函数qask_sum函数展现从开始到现在的所有数据成员之和
    由于sum是静态数据成员,为类共有,所以sum的值应该是a,b的所有数据成员之和。如果有其他的对象,sum的值应当累加。

  • 相关阅读:
    返回一个首尾相连的整数数组中最大子数组的和
    《程序员修炼之道——从小工到专家》读后感一
    成功之路,贵在坚持
    有些路走下去会很苦很累,但是不走会后悔
    商品进行倒计时
    Hibernate中HQL函数汇总及获取当前时间进行比较举例
    java类的继承,多态,抽象类与接口
    equals()与 == 比较,hashCode方法
    面向对象基本知识
    命令控制台与java环境配置
  • 原文地址:https://www.cnblogs.com/OvOq/p/14853126.html
Copyright © 2020-2023  润新知