学生类——读写学生的信息

2018-10-26  本文已影响0人  我喜欢蓝色儿
#include <iostream>
#include <cstring>
using namespace std;

class T
{
private:
    char *id,*name;
public:
    T(const char *p,const char *q)  //构造函数
    {
        id=new char[strlen(p)+1];
        name=new char[strlen(q)+1];  //分配动态内存
        strcpy(id,p);
        strcpy(name,q);  //赋初值
    }
    ~T(){    //析构函数
        delete id;
        delete name;    //删除分配的内存
    }
    void getid(char *p){
        strcpy(id,p);
    } 
    void getname(char *q){   //两个 写入 函数
        strcpy(name,q);
    } 
    char *showid(){ 
        return id;
    } 
    char *showname(){   //两个 读取 函数
        return name;
    } 
};

int main()
{
    T s("20172201","HJS");
    cout<<"学号:"<<s.showid()<<endl;
    cout<<"姓名:"<<s.showname()<<endl;
    char p[80],q[80];
    cin>>p>>q;
    s.getid(p);
    s.getname(q);
    cout<<"学号:"<<s.showid()<<endl;
    cout<<"姓名:"<<s.showname()<<endl;
    return 0;   
}
运行结果

C++课上的一道快速编程训练的题目,因为当初也没有写出来,而且可能与期末考试有关,所以拿来分析一下。
题目大概是(老师口述):定义一个学生类,私有成员有两个——学号和姓名,每一个信息都需要读和写,所以这里需要四个成员函数,加上构造,析构函数,共有6个成员函数。且要求在主函数中cin和cout。
因为之前课上讲的几个代码都是在成员函数中进行cout,所以听到题后,我有些懵圈,不知道如何在主函数中cout(主要还是太受之前知识的限制了,一直没有跳出在成员函数中cout的怪圈)。
当时还纠结了另一个问题,就是如何cin。因为有构造函数,所以在类定义一个对象后要进行赋初值操作,然而既然已经赋了初值,干嘛还要cin,或者说如何在主函数中cin,又能把值传给私有成员呢。
所以我最后就写了一个功能十分残缺的代码。叨叨完后,我来分析一下这个代码。
1、构造函数
因为私有成员定义了两个字符型的指针,但是没有指向,或是内存分配。所以在构造函数中实现赋值操作前要进行内存分配工作:p=new char[n]。然后就可以写赋初值的代码了:把实参的值传给私有成员。
2、析构函数
析构函数不需要调用,在对象使用完毕后,做清理工作,释放系统为对象(自动调用过构造函数)分配的资源。delete用于释放分配的动态内存。
3、写入函数
在主函数中cin学生的信息,需要把值传给私有成员,所以需要一个函数进行这项工作。功能简洁清楚,函数体为:把形参值传给私有成员即可。
4、读取函数
在主函数中cout,所以需要一个函数用来传递私有成员,使其在主函数中输出。所以函数体很自然的想到了用return实现,即返回一个值。另:因为私有成员定义的是字符指针,所以需要声明一个指针函数,返回值为字符指针的首地址。
5、关于编写代码中的编译一直报错情况:



是因为如果构造函数中的形参表中并不是const char *,而是char *,它表示了一个可改变的字符串,即字符变量,但是主函数中定义对象时赋的初值为字符常量,所以产生了矛盾。

上一篇下一篇

猜你喜欢

热点阅读