C++面向对象程序设计 友元创建一个学生类

/***C++面向对象程序设计 友元创建一个学生类
包括学生的姓名和成绩,设计一个友元函数,
比较两个学生成绩的高低,并求出最高分和
最低分学生的姓名 2013 9 3 P162**********/
#include<StdAfx.h>
#include<iostream.h>
#include<string.h>
class student
{
private:
char name[10];
double mark;
public:
student(char na[],double d)
{
strcpy(name,na);
mark=d;
}
char *getname()
{
return name;
}
friend int compare(student &s1,student &s2)
{
if(s1.mark>s2.mark)
return 1;
else if(s1.mark==s2.mark)
return 0;
else
return -1;
}
};
void main()
{
student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)};
int i,min=0,max=0;
for(i=1;i<4;i++)
{
if(compare(st[max],st[i])==-1)
max=i;
else if(compare(st[min],st[i])==1)
min=i;
}
cout<<"输出结果:"<<endl;
cout<<" 最高分:"<<st[max].getname()<<endl;
cout<<" 最低分:"<<st[min].getname()<<endl;
}
摘要:本文实现了一个C++学生类,包含姓名和成绩属性。通过定义友元函数compare()比较两个学生的成绩高低,在main()函数中创建4个学生对象,遍历比较后输出最高分和最低分学生的姓名。李明以92分获得最高分,张伟以62分获得最低分。程序展示了友元函数访问类私有成员的特性。
好 我们继续下去,那联合union在C语言里面我们遇到过的,是吧,它和struct假如你要定义一个union
的话它和struct是不是很相似的?对不对,它也是像struct一样的,允许什么,就像结构一样 它允许啊
它的里面的多种元素呢是具有不同的数据类型, 是不是?但是呢它呢 和struct就是结构不一样的地方在
哪里呢?它的里面的这些成员数据啊都放在一个统一的内存当中,那么假如我们把一个联合定义在一个结构
或类的类型里面的话,比如像下面这样,本来我是定义一个结构struct这worker是工人的,那么它有自己的
数据成员.编号.姓名.级别.那么它本来还有一个职级,那本来这个职级的数据类型呢是union型,是不是?
它是一个union的一个联合的一个名,那么在它的这个结构里面呢又有干部职级教师职级和工人职级.那么
你可以看到.它有没有给它起个名字啊?没有起名字,是不是?没有给这个union起名字,因此它就是一个无名
的联合,那么成为一个无名的联合在使用它的时候会怎么样呢?现在还是刚才那个结构,结构名呢就是worker
这个worker这个结构的定义,那么现在我在worker这个类型下面,我结构类类型下我定义了一个结构变量,
现在是真真实实有存储空间的变量,叫employee就是雇员, 对吧?啊我这里想想看,在这个worker前面加了
一个struct 我把它去掉行不行啊?可以的啊,就是前面讲过,在C++是可以的,在C是不可以的,是吧. 当我
通过employee这个结构变量啊来访问它的内部这个成员的时候,你看我通过employee访问这个number的话
应该怎么写啊?通过employee访问number的时候应该怎么写啊?你自己再自己再想想看,employee点,是不是?
对不对?对象打点number,是不是?唉,对.它是一个什么?整型的?是个东西啊? 是个字符型还是整型啊?给我
说一下是什么?是字符型的, 字符串六位的?你给我说一下我就不用换过去了吗. 啊是个字符串。那么它有
六位是不是000000。 有是吧?那么哦还不能这么来吧,字符还不能这样,这样来赋值.那么,怎么搞不下来啊,
但是当我访问它的这个在union这个下面的这个成员cadre的时候,本来我要通过union的这个什么变量,用
employee打点再union名字打点再cadre是不是?因为它是无名的话我就可以怎么样直接的使用,也就是它
前面所讲的,当你要访问它的数据成员的时候呢就把union的这个成员呢直接作为结构或类中的成员来使用,
那么对于这个无名的union这也是,它的这个数据成员i和f呢是放在同一个存储空间里面的,那么你要对它
进行存取的时候呢,也就是说你要给它赋值,或者取它数值的时候呢 就直接叫出它的名字就可以了。为什么
呢?它前面没有名,对不对?有名的话你就把它名字写出来再点一下.
530
我们再来看强制类型转换,那么在C语言当中呢,如果要把一个整型的数据转换为浮点型的话呢,比如这个整型
的变量i,要转换为浮点型。因为要把它赋给什么浮点型的变量X的时候,我们把这个类型的名字啊写在这个
变量i的前面就好像是个运算符,对不对?就好像是个运算符呢对这个变量I进行什么?进行操作,把你这个i
后面加了个点名一样,是吧.那么在C++当中呢,它是让类型名呢像一个函数名一样.你看同样是变量整型变量i,
现在要换为浮点型.就让float象个什么? 像一个函数一样的, 它把这个i就作为一个什么? 实参了。是不是?
然后返回的就是它的什么?它的返回值就是这个i转变为float型以后的那个数据。那么其实呢它这里使用的
方式呢是一致的,因为在下一堂课开始呢,我们将来就会讲到什么讲到类了class.那么如果呢你建立了一个
类, 比如它叫类名的话,那么这个类你可以在这个类名下面你当它是一种数据类型定义一个对象.你有的时候
啊也可以把这个类名呢作为一个什么?象作为一个函数一样的,把另外一个不同数据类型的变量转换成这个
类名的一个什么?一个对象.因为你这个类名就是一个数据类型啊.把这个数据类型就像作为一个函数一样,
但是并不是真的函数, 就是看上去象一个函数一样,
就作为一个函数一样的 定义一个对象,你来看
来使用
那么再来看NEW 和delete,NEW 和delete是用来干什么的呢?
这两个运算符 需要动态的分配和释放内存什么叫 动态的分配和释放内存在C语言当中
我们有一个数据要存放的时候呢我们的习惯是什么呢?
你就尽可能把它开的很大,但是我开的空间却很大,我用完了之后再还给你.
系统为这个变量开的空间的话 你就有可能开一个很大的数组 给你存放来来回回
要运算的数据就会想 我需要多少数据的时候你开给我 free就是释放这个内存 你用完了还可以释放 蛮细的规则,分配这个空间
的内存的时候 计算某种数据类型它需要开多少内存 他们对数据类型需要开多少空间呢是不同的 它就一个sizeof 一个字节两个字节
还是四个字节 指针的名字就叫 指向char型的指针 分配各种各样的空间 加一或者减一的时候 你得告诉别人是不是 明白没有?
我还给你的这个地址 这个函数啊 虽然 但是用的时候有两点 第一 那么第二条你就可以看到 分别指向char型的和int型的
那么释放多少呢 就知道应该释放多少字节了 delete呢 是也要指明数据类型 而且呢 NEW 这个运算符 也用不着 我把它非得转换成
那个地址 就会分配一个这样的存储空间 int型变量的地址 用NEW开一个空间 它要开多大啊 在double 地址 指针,
那么我们看这里 我们前面讲的是用什么数据类型啊 那么这个 占的空间就是什么 字符串指针占的空间,这种数据类型 一个是指针型的
说明一个指针 这次开的空间 那么 它就可以根据这个 说明这个成员的 返回的 这样的一个指针 那么 我们把 大小
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)