valarray 包含对象成员的类(cpp14章)

C++代码重用   

1.公有继承可以实现 

2.包含、私有继承、保护继承用于实现has-a关系,即新的类将包含另一个类的对象

(使用这样类成员:本身是另外一个类对象称为包含 (组合或层次化)。)

3.函数模板、类模板

valarray类构造函数举例 

double gap[5] = { 3.1,3.5,3.8,2.9,3.3 };
valarray<double> v1;   //创建1个double类型的空数组
valarray<int> v2(8);   //创建8个int类型数组
valarray<int> v3(10,8); //创建8个int类型数组,数组中每个数都是10
valarray<double> v4(gap,4);//取出gap数组的前四个元素用于填充v4数组
valarray<int> v5 = { 20,32,17,9 };//C++ 11中

类方法举例:

operator[]() : 访问各个元素
size() : 返回包含的元素数
sum() : 返回所有元素的总和
max() : 返回最大的元素
min(): 返回最小的元素

举例:每个学生的录入考试成绩  (has_a关系,学生有姓名,也有一组考试成绩)

        用string对象表示学生的名字,valarray<double>表示考试的分数

       将其声明为私有,意味着Valarray类的成员函数可以使用string和valarray<double>类的公有接口来访问和修改name和scores对象。但类外不可这么做,只能通过Valarray类的公有接口访问name和scores。通常被描述为:Valarray类获得了其成员对象的实现,但没有继承接口。

代码:

valarray.h

#ifndef VALARRAY_H_
#define VALARRAY_H_
#include <iostream>
#include <string>
#include <valarray>
using namespace std;//14章  14.1 valarray包含成员对象的类
class Student
{
private:typedef valarray<double> ArrayDb;string name;ArrayDb scores;//valarray<double> ArrayDb 
public:Student():name("Null student"),scores(){} //成员初始化列表explicit Student(const string&s):name(s), scores() {}  //explicit关闭隐式转换,使其只能显调用explicit Student(int n) :name("Nully"), scores(n) {}Student(const string&s,int n) :name(s), scores(n) {}Student(const string&s, const ArrayDb &a) :name(s), scores(a) {}Student(const string&s, const double *pd,int n) :name(s), scores(pd,n) {}~Student(){}double Average() const; //平均成绩 不可修改const string &Name() const;double &operator[](int n); //stu[0]=100;double operator[](int n) const;//a=stu[0]friend istream &operator >>(istream &is, Student &stu);//友元函数重载输入输出运算符friend istream &getline(istream &is, Student &stu);friend ostream &operator<<(ostream &os, Student &stu);
};#endif // !VALARRAY_H_

valarray.cpp

#include "valarray.h"double Student::Average() const
{if (scores.size() > 0)return  scores.sum() / scores.size();elsereturn 0.0;
}const string & Student::Name() const
{return name;
}double & Student::operator[](int n)
{return scores[n];
}double Student::operator[](int n) const
{return scores[n];
}istream & operator>>(istream & is, Student & stu)
{is >> stu.name;return is;
}istream & getline(istream & is, Student & stu)
{getline(is, stu.name);return is;
}ostream & operator<<(ostream & os, Student & stu)
{os << "Scores for" << stu.name << ":" << endl;//显示学生的姓名和各科分数int i;int lim = stu.scores.size();if (lim > 0){for ( i = 0; i < lim; i++){os << stu.scores[i] << " ";if (i % 5 == 4)os << endl;}if (i % 5 != 0)os << endl;}elseos << "Empty array" << endl;return os;}

main.cpp

#include <iostream>
#include "valarray.h"using namespace std;
const int pupils = 3; //人数
const int quizzes = 5;//每个人都有5门成绩
void set(Student &sa, int n);
int main()
{Student ada[pupils] = { Student(quizzes),Student(quizzes) ,Student(quizzes) };int i;for (i = 0; i < pupils; i++)set(ada[i], quizzes);cout << "\n Student List:" << endl;for (i = 0; i < pupils; i++)cout << ada[i].Name() << endl;//显示每个学生的姓名cout << "\n Result List:" << endl;for (i = 0; i < pupils; i++)cout << ada[i];cout << "Average:" << ada[i].Average() << endl;return 0;
}void set(Student &sa, int n)
{cout << "Please enter the student's name:";getline(cin, sa);cout << "Please enter:" << n << "quiz scores:" << endl;for (int i = 0; i < n; i++)cin >> sa[i];while (cin.get() != '\n');
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/104751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoLang连接mysql数据库

跟着文档走GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 1.使用命令拉取 go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite2.开始使用 package mainimport ("fmt""github.com/gin-gonic/gin"&…

虚幻阴影整理

虚拟阴影贴图&#xff08;VSM&#xff09;是一种全新的阴影贴图方法&#xff0c;可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和反射以及世界分区功能结合使用&#xff0c;它能够实现电影级的品质效果&#xff0c;为大型开放场景提供光照。 …

mysql case when 不命中缓存

case when 在sql 中非常方便数据不同维度统计&#xff0c;但是也会出现mysql 索引不命中问题&#xff0c;当多个case 出现时&#xff0c;需要提取出来到where里面优化 优化后 SELECT date(RecordTime) AS date, count( DISTINCT CASE WHEN Param 1 …

Java之TCP和UDP进行网络编程

目录 一.网络编程 1.1网络编程的作用 1.2网络编程的基本概念 1.3网络编程的实现 二.UDP网络编程 2.1UDP数据报套的初步了解 2.2Java数据报套接字通信模型 2.3Java编程实现UDP通信 三.TCP网络编程 3.1TCP流套接字api 3.2TCP通信代码实现 3.2.1短连接实现代码 3.…

钉钉数字校园小程序开发:开启智慧教育新时代

随着信息技术的快速发展和校园管理的日益复杂化&#xff0c;数字校园已成为现代教育的重要趋势。钉钉数字校园小程序作为一种创新应用&#xff0c;以其专业性、思考深度和逻辑性&#xff0c;为学校提供了全新的管理、教学和沟方式。本文从需求分析、技术实现和应用思考三个方面…

websocket逆向-protobuf序列化与反序列化

系列文章目录 训练地址&#xff1a;https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一&#xff1a;Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…

Apipost连接数据库详解

Apipost提供了数据库连接功能&#xff0c;在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持&#xff1a;Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接&#xff1a; 在「项目设置…

【Redis】使用Java客户端操作Redis

目录 引入jedis依赖连接Redis命令get/setexists/delkeysexpire/ttltype 引入jedis依赖 连接Redis 命令 get/set exists/del keys expire/ttl type

C++笔记之获取线程ID以及线程ID的用处

C笔记之获取线程ID以及线程ID的用处 code review! 文章目录 C笔记之获取线程ID以及线程ID的用处一.获取ID二.线程ID的用处2.1.线程池管理2.2.动态资源分配2.3.使用线程同步机制实现互斥访问共享资源2.4.使用线程 ID 辅助线程同步2.5.任务分发&#xff1a;线程ID可以用于将任务…

Qt 窗口与部署应用程序发布包 day6

Qt 窗口与部署应用程序发布包 day6 QWidget QWidget是所有可视控件的基类&#xff0c;每个控件都是矩形按照Z轴顺序排序如果控件没有父控件&#xff0c;则称为窗口 设置exe窗口图标 在项目文件中新建一个文件夹Resource&#xff0c;来存放图标文件 第一种方法 用绝对路…

UE4和C++ 开发--HUD类

HUD 平视显示器(Head Up Display),简称HUD。在蓝图中是指在屏幕上面绘制的二维物体。 1. 创建HUD 打开蓝图编辑器&#xff0c;创建一个蓝图类&#xff0c;搜索HUD&#xff0c;选择并命名BP_HUD。 2. 开始绘制 打开事件列表&#xff0c;右键搜索 EventReceive Draw HUD。有两…

互联网Java工程师面试题·Java 并发编程篇·第三弹

目录 26、什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f; 27、为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 27.1 为什么要使用 Executor 线程池框架 27.2 使用 Executor 线程池框架的优点 28、java 中有几种方法可以实现一个线程…

【牛客网刷题(数据结构)】:环形链表的约瑟夫问题

描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; O(n) 示例1 好环形链表的约瑟夫问题是一个经典的问…

分布式链路追踪如何跨线程

背景 我们希望实现全链路信息&#xff0c;但是代码中一般都会异步的线程处理。 解决思路 我们可以对以前的 Runable 和 Callable 进行增强。 可以使用 ali 已经存在的实现方式。 TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题 核心的实现思路如下&#…

内部类概述

一、内部类 1.内部类概述 2.内部类的四种实现形式 1.成员内部类 public class Outer {private int age99;public static String a;//成员内部类public class Inner{private int age88;private String name; // public static String school; //jdk 16开始才支持定义静态…

nvm、node、npm解决问题过程记录

在Windows10如何降级Node.js版本&#xff1a;可以尝试将Node.js版本降级到一个较旧的版本&#xff0c;以查看问题是否得以解决。可以使用Node Version Manager (nvm) 来轻松切换Node.js版本&#xff0c;具体完整步骤&#xff1a; 首先&#xff0c;需要安装Node Version Manager…

C++项目:【负载均衡式在线OJ】

文章目录 一、项目介绍 二、技术栈与开发环境 1.所用技术: 2.开发环境&#xff1a; 三、项目演示 1.运行代码 2.进入项目首页 3.题目列表 4.点击具体一道题 5.编辑代码并提交 四、项目思维导图 五、项目宏观结构 六、Comm公共模块 1.日志工具log.hpp 2.其他工具…

如何在 Spring Boot 中进行分布式追踪

在 Spring Boot 中进行分布式追踪 分布式系统中的应用程序由多个微服务组成&#xff0c;它们可以位于不同的服务器、容器或云中。当出现问题时&#xff0c;如性能瓶颈、错误或延迟&#xff0c;了解问题的根本原因变得至关重要。分布式追踪是一种用于跟踪和分析分布式应用程序性…

linux安装filebeat并收集日志到elasticsearch

摘要&#xff1a; 通过filebeat收集服务器上各个应用的日志到elasticsearch&#xff0c;通过tags区分不同的应用创建不同的索引保存日志。 官网地址&#xff1a; https://www.elastic.co/cn/downloads/past-releases#filebeat 安装步骤&#xff1a; 1&#xff1a;下载并解…

如何利用IP地址定位保护网络安全?

通过IP地址定位可以在一定程度上增强网络安全&#xff0c;但它并不是唯一的安全措施。以下是如何利用IP地址定位来保护网络安全的一些方法&#xff1a; 异常检测和入侵检测&#xff1a;监控网络上的IP地址流量&#xff0c;定位异常活动&#xff0c;如大规模的连接尝试、不寻常的…