zoukankan      html  css  js  c++  java
  • VC++派生类例子

    //【例8.5】赋值兼容规则与自定义的拷贝构造函数。
    #include<iostream>
    #include<string>
    using namespace std;
    
    enum Tsex{mid,man,woman};
    struct course{
    	string coursename;
    	int grade;
    };
    class Person{
    	string IdPerson;			//身份证号
    	string Name;				//姓名
    	Tsex Sex;				//性别
    	int Birthday;				//生日,格式1986年8月18日写作19860818
    	string HomeAddress;		//家庭地址
    public:
    	Person(string,string,Tsex,int,string);
    	Person();
    	Person(Person &ps);
    	~Person();
    	Person & operator=(Person &);
    	void PrintPersonInfo();
    };
    Person::Person(string id,string name,Tsex sex,int birthday,string homeadd){
    	IdPerson=id;
    	Name=name;
    	Sex=sex;
    	Birthday=birthday;
    	HomeAddress=homeadd;
    }
    Person::Person(){
    	IdPerson="#";Name="#";Sex=mid;
    	Birthday=0;HomeAddress="#";
    }
    Person::Person(Person &ps){
    	IdPerson=ps.IdPerson;
    	Name=ps.Name;
    	Sex=ps.Sex;
    	Birthday=ps.Birthday;
    	HomeAddress=ps.HomeAddress;
    }
    Person::~Person(){}
    Person & Person::operator=(Person &ps){
    	IdPerson=ps.IdPerson;
    	Name=ps.Name;
    	Sex=ps.Sex;
    	Birthday=ps.Birthday;
    	HomeAddress=ps.HomeAddress;
    	return *this;
    }
    void Person::PrintPersonInfo(){
    	int i;
    	cout<<"身份证号:"<<IdPerson<<'
    '<<"姓名:"<<Name<<'
    '<<"性别:";
    	if(Sex==man)cout<<"男"<<'
    ';
    	else if(Sex==woman)cout<<"女"<<'
    ';
    	     else cout<<" "<<'
    ';
    	cout<<"出生年月日:";
    	i=Birthday;
    	cout<<i/10000<<"年";
    	i=i%10000;
    	cout<<i/100<<"月"<<i%100<<"日"<<'
    '<<"家庭住址:"<<HomeAddress<<'
    ';
    }
    
    class Student:public Person{//定义派生的学生类
    	string NoStudent;//学号
    	course cs[30];//30门课程与成绩
    public:
    	Student(string id,string name,Tsex sex,int birthday,string homeadd,string nostud);
    	//注意派生类构造函数声明方式
    	Student();
    	Student(Student &Std);
    	~Student();
    	Student & operator=(Student &Std);
    	int SetCourse(string,int);
    	int GetCourse(string);
    	void PrintStudentInfo();
    }; //这里省略了一些成员函数,如赋学号、取学号等
    Student::Student(string id,string name,Tsex sex,int birthday,string homeadd,string nostud)
                 :Person(id,name,sex,birthday,homeadd){//注意Person参数表不用类型
    	NoStudent=nostud;
    	for(int i=0;i<30;i++){//课程与成绩清空,将来由键盘输入
    		cs[i].coursename="#";
    		cs[i].grade=0;
    	}
    }
    Student::Student(){//基类缺省的无参数构造函数不必显式给出
    	int i;
    	NoStudent="#";
    	for(i=0;i<30;i++){//课程与成绩清空,将来由键盘输入 
    		cs[i].coursename="#";
    		cs[i].grade=0;
    	}
    }
    Student::Student(Student &Std):Person(Std){//按赋值兼容规则Std可为Person实参
    	NoStudent=Std.NoStudent;
    	for(int i=0;i<30;i++){
    		cs[i].coursename=Std.cs[i].coursename;
    		cs[i].grade=Std.cs[i].grade;
    	}
    }
    Student::~Student(){}//基类析构函数不必显式给出
    
    Student & Student::operator=(Student &Std){
    	this->Person::operator=(Std);
    	NoStudent=Std.NoStudent;
    	for(int i=0;i<30;i++){
    		cs[i].coursename=Std.cs[i].coursename;
    		cs[i].grade=Std.cs[i].grade;
    	}
    	return *this;
    }
    int Student::SetCourse(string coursename,int grade){
    	bool b=false;//标识新输入的课程,还是更新成绩
    	for(int i=0;i<30;i++){
    		if(cs[i].coursename=="#"){
    			//判表是否进入未使用部分(如有对应删除应按顺序表方式)
    			cs[i].coursename=coursename;
    			cs[i].grade=grade;
    			b=false;
    			break;
    		}
    		else if(cs[i].coursename==coursename){
    			cs[i].grade=grade;
    			b=true;
    			break;
    		}
    	}
    	if(i==30) return 0;//成绩表满返回0
    	if(b) return 1;//修改成绩返回1
    	else return 2;//登记成绩返回2
    }
    int Student::GetCourse(string coursename){
    	for(int i=0;i<30;i++)
    		if(cs[i].coursename=="#") break;//无此句,stcpy()会出错
    		else if(cs[i].coursename==coursename) return cs[i].grade;
    	return -1;
    }//找到返回成绩,未找到返回-1
    void Student::PrintStudentInfo(){
    	int i;
    	cout<<"学号:"<<NoStudent<<'
    ';
    	PrintPersonInfo();
    	for(i=0;i<30;i++)//打印各科成绩
    		if(cs[i].coursename!="#")cout<<cs[i].coursename<<'	'<<cs[i].grade<<'
    ';
    		else break;
    	cout<<"--------完-------- "<<endl;
    }
    int main(void){
    	string temp;
    	int i,k;
    	Person per1("320102820818161","沈俊",man,19820818,"南京四牌楼2号");
    	per1.PrintPersonInfo();
    	Person per2=per1,per3;                      //基类对象拷贝初始化
    	per2.PrintPersonInfo();
    	per3=per1;                                //基类对象深拷贝赋值
    	per3.PrintPersonInfo();
    	Student stu1("320102811226161","朱海鹏",man,19811226,"南京市黄浦路1号", 
    		"06000123");
    	cout<<"请输入各科成绩:"<<'
    ';              //完整应输入学号,查找,再操作
    	while(1){                                  //输入各科成绩,输入"end"停止
    		cin>>temp;                            //输入格式:物理  80
    		if(temp=="end") break;
    		cin>>k;
    		i=stu1.SetCourse(temp,k);
    		if(i==0)cout<<"成绩列表已满!"<<'
    ';
    		else if(i==1)cout<<"修改成绩"<<'
    ';
    		     else cout<<"登记成绩"<<'
    ';
        }
    	stu1.PrintStudentInfo();
    	Student stu2=stu1,stu3;//派生类对象深拷贝初始化
    	stu2.PrintStudentInfo();
    	stu3=stu2;//派生类对象深拷贝赋值
    	stu3.PrintStudentInfo();
    	return 0;
    }
  • 相关阅读:
    javaSE基础(六)--IO流
    javaSE基础(五)--JDBC
    javaSE基础(四)--Map集合
    javaSE基础(三)--List集合
    javaSE基础(二)
    javaSE基础(一)
    eclipse快捷键大全
    mybatis学习-基础
    工厂模式
    GC日志和jvm内存的分代
  • 原文地址:https://www.cnblogs.com/htys/p/3313859.html
Copyright © 2011-2022 走看看