当前位置: 首页 > news >正文

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.lryc.cn/news/192474.html

相关文章:

  • 2023双11笔记本电脑候选名单(截止2023.10.13的价格,双十一活动可能会更便宜一点)
  • Springcloud笔记(4)-客户端负载均衡Ribbon
  • MediaRecorder媒体录音机
  • 短视频如何批量添加水印
  • RT-Thread MQTT(学习)
  • Vue_Bug VUE-ELEMENT-ADMIN默认是英文模式
  • Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍
  • docker的资源限制参数设置错误,导致的clickhouse性能瓶颈
  • Vue路由守卫有哪些,怎么设置,有哪些使用场景?
  • 云原生网关可观测性综合实践
  • vue-element-admin—登录页面添加自定义背景
  • 软设上午题-错题知识点一
  • 微信小程序(小程序入门)
  • 虹科分享 | 想买车无忧?AR为您带来全新体验!
  • easyUI重新渲染
  • html和css基础练习
  • Linux信号 signal()编程
  • 【LeetCode】16.最接近的三数之和
  • 嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)
  • 智能呼叫中心系统的未来发展趋势:为企业开启全新服务模式
  • UE5中实现沿样条线创建网格体2-SplineMesh版本
  • 实现Element Select选择器滚动加载
  • C++ 之 Vector 和 List
  • 力扣-448.找到所有数组中消失的数字
  • 常用gdb调试命令
  • 【动手学深度学习-Pytorch版】BERT预测系列——用于预测的BERT数据集
  • 【数据结构-字符串 三】【栈的应用】字符串解码
  • Stm32_标准库_10_TIM_显示时间日期
  • 10-SRCNN-使用CNN实现超分辨成像
  • cmd/bat 输出符,控制台日志输出到文件