博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Primer Plus 学习笔记 第十四章 valarray类 私有继承
阅读量:4127 次
发布时间:2019-05-25

本文共 5276 字,大约阅读时间需要 17 分钟。

Valarray类

模板类

格式:

基本函数:

程序示例:

studentc.h 奇怪 为毛没有彩色

#ifndef STUDENTC_H_#define STUDENTC_H_#include 
#include
#include
class Student{ private: typedef std::valarray
ArrayDb; std::string name; ArrayDb scores; std::ostream & arr_out(std::ostream & os) const; public: Student() : name("Null Student"), scores() {} explicit Student(const std::string & s) : name(s), scores() {} explicit Student(int n) : name("Nully"), scores(n) {} Student(const std::string & s, int n) : name(s), scores(n) {} Student(const std::string & s, const ArrayDb & a) : name(s), scores(a) {} Student(const char* str, const double* pd, int n) : name(str), scores(pd, n) {} ~Student() {} double Average() const; const std::string & Name() const; double & operator[] (int i); double operator[] (int i) const; friend std::istream & operator >> (std::istream & is, Student & stu); friend std::istream & getline(std::istream & is, Student & stu); friend std::ostream & operator << (std::ostream & os, const Student & stu);};#endif

student.cpp

#include "studentc.h"using std::ostream;using std::endl;using std::istream;using std::string;double Student::Average() const{  if (scores.size() > 0)    return scores.sum() / scores.size();  else    return 0;}const string & Student::Name() const{  return name;}double & Student::operator[](int i){  return scores[i];}double Student::operator[](int i) const{  return scores[i];}ostream & Student::arr_out(ostream & os) const{  int i;  int lim = scores.size();  if (lim > 0)  {    for (i = 0; i < lim; i++)    {      os << scores[i] << " ";      if (i % 5 == 4)        os <
>(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, const Student & stu){ os << "Scores for " << stu.name << ":\n"; stu.arr_out(os); return os;}

use_stuc.cpp

#include 
#include "studentc.h"using std::cout;using std::cin;using std::endl;void set(Student & sa, int n);const int pupils = 3;const int quizzes = 5;int main(){ Student ada[pupils] = {Student(quizzes), Student(quizzes), Student(quizzes)}; int i; for (i = 0; i < pupils; ++i) set(ada[i], quizzes); cout << "\nResults:"; for ( i = 0; i < pupils; ++i) { cout << endl << ada[i]; cout << "average: " << ada[i].Average() <
> sa[i]; while (cin.get() != '\n') continue;}

运行结果

私有继承:

私有继承与包含的区别:

如果需要调用基类的对象咋搞?

在私有继承中,在没有显式类型转换的情况下,不能将指向派生类的对象或引用赋给基类引用或指针

还有一种情况是 多重继承 编译器无法确定要转换成哪个基类 因为都有operator<<()

私有继承的程序示例:

studenti.h

#ifndef STUDENTC_H_#define STUDENTC_H_#include 
#include
#include
class Student : private std::string, private std::valarray
{ private: typedef std::valarray
ArrayDb; std::ostream & arr_out(std::ostream & os) const; public: Student() : std::string("Null Student"), ArrayDb() {} explicit Student(const std::string & s) : std::string(s), ArrayDb() {} explicit Student(int n) : std::string("Nully"), ArrayDb(n) {} Student(const std::string & s, int n) : std::string(s), ArrayDb(n) {} Student(const std::string & s, const ArrayDb & a) : std::string(s), ArrayDb(a) {} Student(const char* str, const double* pd, int n) : std::string(str), ArrayDb(pd, n) {} ~Student() {} double Average() const; const std::string & Name() const; double & operator[] (int i); double operator[] (int i) const; friend std::istream & operator >> (std::istream & is, Student & stu); friend std::istream & getline(std::istream & is, Student & stu); friend std::ostream & operator << (std::ostream & os, const Student & stu);};#endif

studenti.cpp

#include "studenti.h"using std::ostream;using std::endl;using std::istream;using std::string;double Student::Average() const{  if (ArrayDb::size() > 0)    return ArrayDb::sum() / ArrayDb::size();  else    return 0;}const string & Student::Name() const{  return (const string &) *this;}double & Student::operator[](int i){  return ArrayDb::operator[](i);}double Student::operator[](int i) const{  return ArrayDb::operator[](i);}ostream & Student::arr_out(ostream & os) const{  int i;  int lim = ArrayDb::size();  if (lim > 0)  {    for (i = 0; i < lim; i++)    {      os << ArrayDb::operator[](i) << " ";      if (i % 5 == 4)        os <
>(istream & is, Student & stu){ is >> (string &) stu; return is;}istream & getline(istream & is, Student & stu){ getline(is, (string &) stu); return is;}ostream & operator<<(ostream & os, const Student & stu){ os << "Scores for " << (string &) stu << ":\n"; stu.arr_out(os); return os;}

use_stui.cpp

#include 
#include "studenti.h"using std::cout;using std::cin;using std::endl;void set(Student & sa, int n);const int pupils = 3;const int quizzes = 5;int main(){ Student ada[pupils] = {Student(quizzes), Student(quizzes), Student(quizzes)}; int i; for (i = 0; i < pupils; ++i) set(ada[i], quizzes); cout << "\nResults:"; for ( i = 0; i < pupils; ++i) { cout << endl << ada[i]; cout << "average: " << ada[i].Average() <
> sa[i]; while (cin.get() != '\n') continue;}

 

用包含还是用私有继承?

完结 

转载地址:http://mnepi.baihongyu.com/

你可能感兴趣的文章
Python 系列教程 | 字符串
查看>>
Python爬虫偷懒神器 ---- 快速构造请求头!
查看>>
全面拥抱 FastApi — 多应用程序管理蓝图APIRouter
查看>>
全面拥抱FasiApi ——三大参数及验证
查看>>
Python爬虫|JS逆向调试技巧大全
查看>>
scrapy 出现 [twisted.internet.error.TimeoutError:] 的几种解决方案
查看>>
用Python分析了近几年富豪排行榜,我酸了...
查看>>
爬虫|如何在scrapy请求异常之后再设置代理IP
查看>>
当Django遇上Pyecharts将碰撞出怎样的火花……
查看>>
全面拥抱FastApi-优雅的处理HTTPException
查看>>
茅台抢购脚本详细教程!!!另已将茅台抢购做成了一个软件!!!
查看>>
Python自动抢火车票神器!!
查看>>
疫情蔓延国内各大互联网都推迟上班了,里面有你的公司吗?
查看>>
扩散!互联网+大数据工具:“密切接触者测量仪”上线
查看>>
Docker的安装以及加速器的配置
查看>>
一张图看懂字节跳动8年创业史,太励志了吧
查看>>
Pandas中文官档 ~ 基础用法
查看>>
绝了!一个 rm-rf 把公司整个数据库删没了...
查看>>
教你如何阅读 Python 开源项目代码
查看>>
用 Python 手写十大经典排序算法
查看>>