《C++语言基础》参考——学生可以相加吗?

返回:贺老师课程教学链接

  谈及运算,我们总是习惯“数”的运算。而实际上,像时间之类的对象也是可以进行加减运算的。再进一步,我们的思维还可以拓展,运算加以加到任何事物上,只要我们可以为这些“运算”设计好意义。

  例如:有班级类和学生类。两个学生相加,组成了一个由两个学生构成的班级;班级加学生,代表班级增加了一名新同学;学生乘学生,结果为这两个学生“结对子”,可以做某些事(这个对子,需要定义成一个新的类);班级乘班级,是班级中的所有学生,两两结对子的所以可能组合。

  实际上,班级和学生,已经初步具备了数据库中用“学生表”存储学生信息的特征。一张“学生表”代表一个班级,而这张表中的每一条“记录”,则是具体的学生对象。

  利用数据库技术可以建立这张表格,可以用操纵数据库的语言(SQL语言),完成对数据的相关处理。

  这些处理,建立在数据库理论基础上。对于关系型数据库(前述“学生表”,按术语讲,就是一个“关系”),其基础是“关系代数”。关系代数,实际上就是定义了一组运算。无论这些运算用什么样的符号,可以与C++中重载后的运算符建立起联系来,让我们一起体会一下,若用C++去实现数据库最底层的运算,将可以采取什么样的策略。

  更深一层,代数系统就是由一个非空集合和一组运算构成的系统。这是任何计算模型(计算模型可以是通用的模型,更多我们强调的就是解决具体问题的计算模式),在本质上的描述。关系代数,只不过也就是代数系统中的一个例子罢了。

  所以,有机会“科班”学习计算机的同学,随着课程的进展,借助离散数学(代数系统是这门课程中的一部分)、可计算性理论等,体会从最一般的、抽象的层面看待计算,这是形成专业思维的重要部分。

  当然,在学习C++的时候,体会到“万物皆对象,各种操作皆运算”,摆脱运算一定是施加于“数”上的观念,可以有助于将未来要学习的抽象理论具体起来。大学的学习,达到理论联系实际很有必要。为此,本文的目标,就是让菜鸟在接触专业理论之前,至少隔着门缝看了一眼。

  下面的代码来点干货,学生加学生的运算,可以这样实现:

#include <iostream>
using namespace std;
class Student;
class Class //班级类
{
    int number;
    Student *students;
    friend class Student;
public:
    Class();
    Class(const Class &c);
    void display();
};

class Student //学僧类
{
private:
    int num;
    string name;
    char sex;
    int age;
    friend class Class;
public:
    Student(){}
    Student(int n, string nam, char s, int a);
    Class operator+(Student &s1);
};

Class::Class():number(0),students(NULL) {}
Class::Class(const Class &c)
{
     number=c.number;
     students=new Student[number];
     int i;
     for(i=0;i<number;i++)
        students[i]=c.students[i];
}
void Class::display()
{
    int i;
    for(i=0; i<number; i++)
    {
        cout<<i<<": "<<students[i].num<<", "<<students[i].name;
        cout<<", "<<students[i].sex<<", "<<students[i].age<<endl;
    }
}

Student::Student(int n, string nam, char s, int a):num(n), name(nam), sex(s),age(a) {}
Class Student::operator+(Student &s1)
{
   Class c;
    c.number=2;
   c.students=new Student[c.number];
        c.students[0]=*this;
        c.students[1]=s1;
         return c;
}

int main()
{
    Student s1(1, "Zhang", ‘f‘, 20), s2(2, "Li", ‘m‘, 18);
    Class c = s1+s2;
    c.display();
    return 0;
}

进一步的拓展(请感兴趣的读者作为实践题目):

定义了Student s1, s2; Class c1, c2; 后:

(1)你是否可以定义出支持c1+c2、c1+s1、c1-c2之类的运算?

(2)为s1*s2、s1*c1、c1*c2确定其含义,必要时增加新的类型定义,实现*运算符的重载?

(3)(更远的未来)参考关系代数中对除法的定义,实现c1/s1、c1/c2运算?

时间: 2024-08-29 06:25:42

《C++语言基础》参考——学生可以相加吗?的相关文章

Lua语言基础汇总(8) -- Lua中的元表与元方法

前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理,两个table类型的变量,你是无法直接进行“+”操作的,如果你定义了一个指定的函数,就可以进行了.那本文就是主要讲的是如何定义这个指定的函数,这个指定的函数是什么?希望对学习Lua的朋友有帮助. Lua是怎么做的? 通常,Lua中的每个值都有一套预定义的操作集合,比如数字是可以相加的,字符串是可以连接

JavaScript基础---语言基础(4)

函数,对象和数组 学习要点: 1.函数声明 2.return返回值 3.arguments对象 4.Object类型 5.Array类型 6.对象中的方法 函数是定义一次但却可以调用或执行任意多次的一段JS代码.函数有时会有参数,即函数被调用时指定了值的局部变量.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值. 一.函数声明 函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript中的函数使用functi

20165318 预备作业二 学习基础和C语言基础调查

20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法---做教练与做中学>中的标准:一项技能的掌握程度分为:新手/高级初学者/合格者/精通/专家.我认为自己尚且只达到合格者的程度,并不能说自己的水平凌驾于大多数人之上. 从4岁学到14岁,这些年的学习,还是带给我很多启发,要学好一项技能,要具备以下几点: 兴趣:兴趣是最好的老师.我小时候就对舞蹈很有兴趣,看

20165305 学习基础和C语言基础调查

学习基础和C语言基础调查 <优秀的教学方法---做教练与做中学>心得 在<优秀的教学方法---做教练与做中学>文章中又一次提到了"做教练"这一学习方法,因为我的上一篇文章中已经叙述过,所以我这一次打算重点写"做中学".做中学,把它解释的再明白一点就是说学生应该在做事中学习,对于这一观点,我认为它是一种快速.准确.高效的学习方法.我对文章中印象最深刻.最熟悉的一段话是"肌肉有了记忆能力",拿上学期我上足球课为例,我们在上足球

简单的入门Android开发和Java语言基础[图]

简单的入门Android开发和Java语言基础[图]前言:去年年底到今年年初,我做过简单的智能家居,也实现过一些简单的直连和远程的智能家居.于是就将最简单的通信发布出来:智能家居简单实现-使用ESP8266简单实现和APP通讯由于这方面的资料少之又少,所以阅读量飙升的很快.也有很多人加了好友问我问题.通过问题我发现,很多都是学硬件的.或是做智能家居方面的学生,基本都不会 Android 开发的.问也有很多问我怎么学 Android 开发的.很多的人认知还是停留在学习这种软件开发技术需要去培训机构

Swift语言指南(一)--语言基础之常量和变量

Swift 是开发 iOS 及 OS X 应用的一门新编程语言,然而,它的开发体验与 C 或 Objective-C 有很多相似之处. Swift 提供了 C 与 Objective-C 中的所有基础类型,包括表示整数的 Int,表示浮点数的 Double 与 Float,表示布尔值的 Bool,以及表示纯文本数据的 String. Swift 还为两个基本集合类型 Array 与 Dictionary 提供了强大的支持,详情可参考 (集合类型)Collection Types. 与 C 语言类

02 java语言基础

常量:字面值常量(字符串,字符,整数,小数,布尔,null),自定义常量,''这个不是字符常量,""这个是字符串常量 进制: 02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 字符串常量 用双引号括起来的内容 整数常量 所有整数 小数常量 所有小数 字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号 布尔常量 较为特

03 java语言基础逻辑运算符

03.01_Java语言基础(逻辑运算符的基本用法)(掌握) A:逻辑运算符有哪些 &,|,^,! &&,|| B:案例演示 逻辑运算符的基本用法 注意事项: a:逻辑运算符一般用于连接boolean类型的表达式或者值. b:表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子. 算术表达式:a + b 比较表达式:a == b(条件表达式) C:结论: &逻辑与:有false则false. |逻辑或:有true则true. ^逻辑异或:相同为false,不同

嵌入式linux C++语言(二)——C++对C语言基础语法的扩展

嵌入式linux C++语言(二)--C++对C语言基础语法的扩展 C++是基于C语言扩展发展而来的面向对象的程序设计语言,本文将主要讨论C++语言基于C语言扩展的方面. 一.类型增强 1.类型检查更严格 在C语言中: const int a = 100; int *p = &a; 在C++语言中: const int a = 100;//必须在定义的时候初始化 const int *p = &a; 在C++语言中不能隐式转换数据类型. error: invalid conversion