实验四,静态成员与友元

2023-11-14

一、实验目的和要求

    了解成员函数的特性,掌握静态成员、友元等概念。

二、实验内容

1、调试下列程序,写出输出结果,并分析输出结果。

//sy4_1.cpp
#include<iostream>
using namespace std;
class My
{
public:
	My(int aa)
	{
	A=aa;
	B-=aa;
	}
static void fun(My m);
private:
	int A;
	static int B;
};
void My::fun(My m)
{
	cout<<"A="<<m.A<<endl;
	cout<<"B="<<B<<endl;
}
int My::B=100;
int main()
{
	My P(6),Q(8);
	My::fun(P);
	Q.fun(Q);
	return 0;
}
输出结果:

输出结果分析:创建对象P时,调用构造函数对其初始化得到A=6,B=B-A=100-6=94,再创建对象Q时,调用构造函数对其初始化得到,A=8,B=B-A=94-8=86,最后调用了静态成员函数static void fun(),又因为B是静态数据成员,所以输出此结果。

2、分析并调试程序,完成下列问题。

//sy4_2.cpp
#include<iostream>
#include<cmath>
using namespace std;
class My
{
public:
	My(double i=0){x=y=i;}
	My(double i,double j){x=i;y=j;}
	My(My&m){x=m.x;y=m.y;}
	friend double dist(My&a,My&b);
private:
	double x,y;
};
double dist(My&a,My&b)
{
	double dx=a.x-b.x;
	double dy=a.y-b.y;
	return sqrt(dx*dx+dy*dy);
}
int main()
{
	My m1,m2(15),m3(13,14);
	My m4(m3);
	cout<<"The distance1:"<<dist(m1,m3)<<endl;
	cout<<"The distance2:"<<dist(m2,m3)<<endl;
	cout<<"The distance3:"<<dist(m3,m4)<<endl;
	cout<<"The distance4:"<<dist(m1,m2)<<endl;
	return 0;
}

(1)指出所有的构造函数,它们在本程序中分别起什么作用?

        构造函数My(double i=0)用来对m1,m2进行初始化,My(double i,double j)对m3进行初始化,拷贝构造函数My(My&m)用来对m4进行初始化。

(2)指出设置默认参数的构造函数。

        My(double i=0)为带默认参数的构造函数。

(3)指出友元函数。将友元函数放到私有部分,观察结果是否有变化。

       dist()为友元函数,将其放到私有部分,编译仍是正确的的,因为友元函数声明时仍与普通函数一致的,所以编译时不会出错。

(4)写出输出结果,并分析输出结果。


3、定义一个Student类,在该类定义中包括一个数据成员score(分数)、两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(float s)用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。在main()函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。

#include<iostream>
using namespace std;
class student
{
public:
	void scoretotalcount(float s);
	static float sum();
	static float average();
private:
	float score;
	static float total;
	static int count;
};
float student::total=0;
int student::count=0;
void student::scoretotalcount(float s)
{
	score=s;
	total+=score;
	count++;
}
float student::sum(){return total;}
float student::average(){return total/count;}
int main()
{
	float s;
	int n;
	student a[10];
	cout<<"输入学生个数:";
	cin>>n;
	cout<<"输入学生成绩:";
	for(int i(0);i<n;i++)
	{
		cin>>s;
		a[i].scoretotalcount(s);
	}
	cout<<"班级总分为:";
	cout<<student::sum()<<endl;
	cout<<"班级平均分为:";
	cout<<student::average()<<endl;
	return 0;
}

运行结果:


4、声明Book与Ruler两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。

#include<iostream>
using namespace std;
class Ruler;
class Book
{
public:
	Book(int i=0){weight=i;}
	friend float totalWeight(Book&m,Ruler&n);
private:
	float weight;
};
class Ruler
{
public:
	Ruler(int j=0){weight=j;}
	friend float totalWeight(Book&m,Ruler&n);
private:
	float weight;
};
float totalWeight(Book&m,Ruler&n)
{return m.weight+n.weight;}
int main()
{
	int i,j;
	cout<<"Book weight:";
	cin>>i;
	cout<<"Ruler weight:";
	cin>>j;
	Book B(i);
	Ruler R(j);
	cout<<"totalweight"<<totalWeight(B,R)<<endl;
	return 0;
}

运行结果:


三、分析与讨论

1、如何定义静态数据成员和成员函数?

    答:静态数据成员不属于任何对象,它不因对象的建立而产生,也不因对象的析构而删除,它是类定义的一部分,所以使用静态数据成员不会破坏类的隐蔽性。类中的静态数据成员不同于一般的静态变量,也不同于其他类数据成员。它在程序开始运行时创建而不是在对象创建时创建。它所占空间的回收也不是在析构函数时进行而是在程序结束时进行。

    成员函数用来描述对象的行为,与普通函数一样,它可以重载,可以使用默认参数,还可以声明为内联函数。

2、如何对静态数据成员初始化?

    答:静态数据成员的初始化与一般数据成员不同,它的初始化不能在构造函数中进行。静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员>=<初始值>;   这里的作用域运算符“::”用来说明静态数据成员所属类。

3、静态成员函数访问静态成员与非静态成员有何区别?

    答:C++中静态成员函数是不能访问非静态成员的,但反过来就可以。
因为静态成员是属于类的,它可以在类对象没有被初始化时就访问,而非静态成员则必须要在类对象初始化后才会被创建并初始化,所以在C++中静态函数不能访问非静态成员。

4、如何调用静态成员函数?

    答:调用静态成员函数的格式为:  <类名>::<静态成员函数名>(<参数表>)或<对象名>::<静态成员函数名>(<参数表>)  静态成员函数的主要作用是用来访问同类中的静态成员,维护对象之间共享的对象数。

5、如何理解“静态成员不是属于某个对象的,而是属于类的所有对象的。”这句话?

    答:静态成员是指声明为static的类成员,包括静态数据成员和静态成员函数,在类的范围内所有对象共享该数据。

6、比较友元函数与一般函数在定义和调用方面的异同。

    答:放在类体外定义的函数是一般函数;在类里声明一个普通函数,加上关键字friend,就成了该类的友元函数,它可以访问该类的一切成员。调用友元函数的方式与普通函数的实现完全一样。一个普通的函数可以定义为类的友元函数,一个类的成员函数也可以定义成另一个类的友元函数。

四、实验小结

        通过本次实验我们了解了成员函数的特性,知道了静态成员、友元等概念。在程序的调试过程中也在不断的发现问题并解决问题,总之学到了很多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实验四,静态成员与友元 的相关文章

  • ads原理图生成layout_ADS原理图和版图协同优化仿真方法总结

    1 概述 在用ADS进行射频电路仿真时 在原理图层面仿真完毕后 通常还要考虑实际的射频版图布局中传输线的耦合 印制板介质损耗等效应的影响 此时就要在ADS的版图仿真中来实现 在学习ADS时 需要版图仿真时 通常是先原理建模 然后通过生成版图
  • SpringCloud 微服务服务治理注册中心

    一 什么是服务治理 在传统rpc远程调用中 服务与服务依赖关系 管理比较复杂 所以需要使用服务治理 在这里插入图片描述管理服务与服务之间依赖关系 可以实现服务调用 负载均衡 容错等 实现服务发现与注册 二 服务注册与发现 在服务注册与发现中
  • Unity脚本实现——触摸屏3D模型,随单根手指,无死角旋转(Input的GetTouch方法和touchCount属性)

    Unity脚本实现模型360度旋转 参考别人随手指绕Y轴转动 添加了绕X轴转动 using System Collections using System Collections Generic using UnityEngine publ
  • document 使用方法介绍

    document节点是文档的根节点 每张网页都有自己的document节点 属性 1 document doctype 它是一个对象 包含了当前文档类型 Document Type Declaration 简写DTD 信息 2 docume
  • Tessy — 嵌入式软件单元测试/ 集成测试工具

    Tessy 源自戴姆勒 奔驰公司的软件技术实验室 由德国Hitex 公司负责全球销售及技术支持服务 是一款针对嵌入式软件进行单元 集成测试的工具 它可以对C C 代码进行单元 集成测试 可以自动化搭建测试环境 执行测试 评估测试结果并生成测
  • SpringBoot 线程池的使用

    前言 最近在做订单模块 用户购买服务类产品之后 需要进行预约 预约成功之后分别给商家和用户发送提醒短信 考虑发短信耗时的情况所以我想用异步的方法去执行 于是就在网上看见了Spring的 Async了 但是遇到了许多问题 使得 Async无效
  • flutter Flex Wrap Stack Align布局

    1 flex布局 Flex direction Axis horizontal 水平反向 direction不能为空 direction Axis vertical 垂直反向 Expanded flex 1 实现代码如下 child Con
  • C语言-宏定义

    C语言 宏定义 1 宏定义是什么 2 宏定义怎么用 2 1 宏定义常量 2 1 1 预定义宏 2 1 2 自定义宏 2 2 带参数的宏 2 3 编译预处理 3 宏展开 4 编译预处理指令 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也
  • how to unzip split file

    1 how to unzip split file cat zipfile tar gz tar zxv
  • springBoot整合log4j2

    文章目录 什么是log4j2 springBoot依赖的引入 接下来是log4j2的示例配置 首先在application yml制定采用哪个配置文件 在resources目录下新建log4j2 xml文件 什么是log4j2 Apache
  • Linux系统:stress-ng测压工具

    目录 一 理论 1 stress工具简介与安装 2 语法及参数 3 具体安装 二 实验 1 运行8 cpu 4 fork 5 hdd 4 io 50 vm 10小时 2 CPU测试 3 内存测试 4 IO测试 5 磁盘及I O测试 三 问题
  • Java同步代码块详解

    目录 一 什么是内置锁 二 什么是重入 三 活跃性与性能 四 对象的共享 1 可见性 2 非原子的64位操作 3 volatile变量 一 什么是内置锁 Java提供了一种内置的锁机制来支持原子性 同步代码块 同步代码块包含两部分 一个作为
  • SQL,如何更新表结构

    We can alter an existing table structure using the ALTER TABLE command followed by the alteration you want to make 我们可以使
  • 【Unity】[帮助文档] AddForce函数详解,参数ForceMode(Acceleration、Force、Impulse 和 VelocityChange)的选择

    背景 经常忘 经常查 倒不如我自己写一篇给自己方便参考 毕竟每次都在某N站查出来的都是不知道互抄到哪一年的机翻文章 本文涉及代码与测试参考unity版本为2021 3 AddForce 用于对rigidbody组件对象添加力的作用 其参数决
  • 编程题思路1

    1反转链表 2节点两两反转 3判断链表是否有环 1 0 5毫秒内是否出现Null 2 set中查重 3 快慢指针 4匹配左右括号 5实时判断第K大的元素 大顶堆 实时排序 6 乱序判断 法一 sort NlogN return sorted
  • 手机屏幕的DPI和PPI有什么区别?

    为什么有的手机厂商在屏幕参数一栏标注PPI 而有的手机却标注DPI 这其中又有什么猫腻呢 不同的标注方法会对手机产生那些影响 PPI和DPI的区别是什么 分别都是如何计算的 对你的视觉体验会产生多大的影响呢 DPI即dot per inch
  • 抽取式文档摘要方法(一)

    1 抽取式 从文档中抽取已有句子形成摘要 实现简单 能保证句子的可读性 可看作一个组合优化问题 可与语句压缩一并进行 可看作混合式方法 2 抽取式文档摘要的关键技术 重要信息评估 冗余信息的过滤 碎片化信息的聚合 多源信息的篇章组织 其中单
  • JavaScript——操作浏览器窗口

    学习内容 今天学习了alert提示框 提示框中的内容 就是alert后边小括号中的内容 例如 alert 我要学JavaScript alert 我要学习 学习总结 日常小总结 例如 后面的分号 可以随便去掉 不影响运行效果 不能去掉小括号
  • 在“信创”大背景下 美信时代的业务思路

    数据量的飞速增长 并不是单纯对云端进行扩容就可以完全应对的 大量的数据汇聚到云端进行处理 带来的延迟逐渐让人无法忍受 在移动智能设备终端 延迟往往令实时互动滞后 严重影响体验 在制造业领域 监控瞬时数据量巨大 留给异常数据的处理窗口很小 传
  • lvgl小部件-基础对象学习篇(二)

    lvgl小部件 基础对象学习篇 二 学习材料 工具 QT Creator 5 12 3 lvgl 源代码 极客笔记 学习过程 内容 LVGL 基础对象 坐标 尺寸 位置 对齐 父子关系 屏幕 层次 事件处理 部件 状态 风格 属性 保护 组

随机推荐

  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • Camunda流程驳回至上一节点

    文章目录 前言 一 版本 二 实现 1 回退至上一节点 2 回退至开始节点 3 测试方法 前言 Camunda驳回至上一节点 网上大多都是回退至开始节点 这样逻辑比较简单清晰 但实际使用中 往往需要驳回至上一节点 甚至需要连续驳回多次 流程
  • 读书:《完美主义扼杀效率》

    作者是日本人 全书对比了33条完美主义和实效主义的做法 我只挑几条有感觉的记录在一页纸上 时刻提醒自己 做事的时候不过于追求完美 而是要抓住重点
  • Python脚本05 —— 从七牛服务器下载图片

    coding utf 8 从测试七牛服务器下载图片 import sys import urllib urllib2 import os from qiniu import Auth from qiniu import BucketMana
  • HA集群--corosync+pacemaker

    一 高可用集群的架构 从微观上讲 高可用集群可分为4个层次 1 第一层是信息和基础架构层 主要用于节点之间传心跳信息 节点之间通过UDP传递心跳信息 可以通过广播 组播 单播等方式 2 第二层是成员关系层 作用是主节点通过cluster c
  • C++ 单链表数据操作

    此程序演示带头结点的单链表的实现 数据元素是整数 include
  • 通信协议之应用层

    通信协议之应用层 应用层包含所有的高层协议 例如FTP File Transfer Protocol的简写 中文名称是文件传输协议 SMTP Simple Mail Transfer Protocol的简写 中文名称是简单电子邮件传输协议
  • 位运算符规则

    位运算符规则 左移运算符 lt lt 右移运算符 gt gt 无符号右移运算符 gt gt gt 左移运算符 lt lt 运算规则 丢弃左边 高位 指定位数 右边 低位 补0 右移运算符 gt gt 运算规则 丢弃右边 低位 指定位数 左边
  • 软件测试的职业发展和规划(一)

    作为很多软件测试岗位的朋友来说 职业发展和规划一直是一个比较模糊的概念 知道其重要 却不知如何规划更符合自己的实际情况 下面 我们就分三种情况来简单说一说 一 高管理 低技能 即是我们通常所说的管理路线 在IT业 这个方向的成功者不乏项目经
  • 使用react-pdf预览pdf

    在使用umi构建的react项目中如何实现预览pdf 如果PDF中包含印章该如何使印章展示出来 1 安装依赖 yarn add react pdf react pdf https github com wojtekmaj react pdf
  • Mapped Statements collection does not contain value for

    Caused by java lang IllegalArgumentException Mapped Statements collection does not contain value for com wt mss dao daoi
  • React+Ant.Design 从零开始搭建个人博客实战教程01 —— 起步

    简介 刚入手一个服务器 打算搭个个站 平时工作都是用vue 为了扩展自己的实战能力 来从头开始实战用用react吧 结合ant design一起开发 然后后台nodejs来写 编写我的第一个教程文章 从头到尾记录整个过程 因为是实战项目 部
  • ad中封装绿色解决办法

    1是在工具 检查规则中 把一些项取消检查
  • 推荐一个将MD格式的文档轻松转换到微信公众号的工具

    因为微信公众号自带的编辑器不是特别友好 这也是一个痛点 之前也有使用过google插件 但不是特别灵活 现在推荐的这款工具可以很好的支持将MD格式的文档直接进行渲染 还是非常好用的 话不多说 先给出工具地址 https md openwri
  • 花生壳 Linux arm

    安装和使用Linux花生壳服务 一 安装说明 以CentOS 5为例 1 安装必要的开发包 root localhost yum install gcc gcc c autoconf automake 2 下载phddns 2 0 2 16
  • MongoDB图形化工具下载和使用

    文章目录 MongoDB图形化工具 1 下载地址 2 打开MongoDB服务 3 Compass界面 3 1 连接Mongo 3 2 创建数据库 3 3 创建集合 3 4 删除集合 3 5 增 3 6 改 3 7 删 3 8 查 3 9 导
  • TRPO算法详解

    答主最近学到TRPO 这算法确实很难理解 现在记录答主现在的一点想法 留存记录 先放参考文献 方便大家学习 Reference 1 Sutton R S Barto A G Reinforcement learning An introdu
  • 数组指针数组的定义及使用(about array of pointer of array)

    数组指针数组 array pointer array 该怎么定义和使用呢 如下 定义 define MsgCnt 3 define MsgLen 8 typedef char MsgArray MsgCnt MsgLen typedef c
  • J2EE之XML建模

    目录 一 什么叫XML建模 二 XML建模 1 根据XML配置文件元素节点创建元素节点实体类 2 利用dom4j xpath技术实现XML建模 一 什么叫XML建模 将XML配置文件中的元素 属性 文本信息转换成对象的过程叫做XML建模 二
  • 实验四,静态成员与友元

    一 实验目的和要求 了解成员函数的特性 掌握静态成员 友元等概念 二 实验内容 1 调试下列程序 写出输出结果 并分析输出结果 sy4 1 cpp include