#include <iostream>
#include <cstring>
using namespace std;
class T
{
private:
char *id,*name;
public:
T(const char *p,const char *q) //構(gòu)造函數(shù)
{
id=new char[strlen(p)+1];
name=new char[strlen(q)+1]; //分配動(dòng)態(tài)內(nèi)存
strcpy(id,p);
strcpy(name,q); //賦初值
}
~T(){ //析構(gòu)函數(shù)
delete id;
delete name; //刪除分配的內(nèi)存
}
void getid(char *p){
strcpy(id,p);
}
void getname(char *q){ //兩個(gè) 寫(xiě)入 函數(shù)
strcpy(name,q);
}
char *showid(){
return id;
}
char *showname(){ //兩個(gè) 讀取 函數(shù)
return name;
}
};
int main()
{
T s("20172201","HJS");
cout<<"學(xué)號(hào):"<<s.showid()<<endl;
cout<<"姓名:"<<s.showname()<<endl;
char p[80],q[80];
cin>>p>>q;
s.getid(p);
s.getname(q);
cout<<"學(xué)號(hào):"<<s.showid()<<endl;
cout<<"姓名:"<<s.showname()<<endl;
return 0;
}

C++課上的一道快速編程訓(xùn)練的題目,因?yàn)楫?dāng)初也沒(méi)有寫(xiě)出來(lái),而且可能與期末考試有關(guān),所以拿來(lái)分析一下。
題目大概是(老師口述):定義一個(gè)學(xué)生類(lèi),私有成員有兩個(gè)——學(xué)號(hào)和姓名,每一個(gè)信息都需要讀和寫(xiě),所以這里需要四個(gè)成員函數(shù),加上構(gòu)造,析構(gòu)函數(shù),共有6個(gè)成員函數(shù)。且要求在主函數(shù)中cin和cout。
因?yàn)橹罢n上講的幾個(gè)代碼都是在成員函數(shù)中進(jìn)行cout,所以聽(tīng)到題后,我有些懵圈,不知道如何在主函數(shù)中cout(主要還是太受之前知識(shí)的限制了,一直沒(méi)有跳出在成員函數(shù)中cout的怪圈)。
當(dāng)時(shí)還糾結(jié)了另一個(gè)問(wèn)題,就是如何cin。因?yàn)橛袠?gòu)造函數(shù),所以在類(lèi)定義一個(gè)對(duì)象后要進(jìn)行賦初值操作,然而既然已經(jīng)賦了初值,干嘛還要cin,或者說(shuō)如何在主函數(shù)中cin,又能把值傳給私有成員呢。
所以我最后就寫(xiě)了一個(gè)功能十分殘缺的代碼。叨叨完后,我來(lái)分析一下這個(gè)代碼。
1、構(gòu)造函數(shù)
因?yàn)樗接谐蓡T定義了兩個(gè)字符型的指針,但是沒(méi)有指向,或是內(nèi)存分配。所以在構(gòu)造函數(shù)中實(shí)現(xiàn)賦值操作前要進(jìn)行內(nèi)存分配工作:p=new char[n]。然后就可以寫(xiě)賦初值的代碼了:把實(shí)參的值傳給私有成員。
2、析構(gòu)函數(shù)
析構(gòu)函數(shù)不需要調(diào)用,在對(duì)象使用完畢后,做清理工作,釋放系統(tǒng)為對(duì)象(自動(dòng)調(diào)用過(guò)構(gòu)造函數(shù))分配的資源。delete用于釋放分配的動(dòng)態(tài)內(nèi)存。
3、寫(xiě)入函數(shù)
在主函數(shù)中cin學(xué)生的信息,需要把值傳給私有成員,所以需要一個(gè)函數(shù)進(jìn)行這項(xiàng)工作。功能簡(jiǎn)潔清楚,函數(shù)體為:把形參值傳給私有成員即可。
4、讀取函數(shù)
在主函數(shù)中cout,所以需要一個(gè)函數(shù)用來(lái)傳遞私有成員,使其在主函數(shù)中輸出。所以函數(shù)體很自然的想到了用return實(shí)現(xiàn),即返回一個(gè)值。另:因?yàn)樗接谐蓡T定義的是字符指針,所以需要聲明一個(gè)指針函數(shù),返回值為字符指針的首地址。
5、關(guān)于編寫(xiě)代碼中的編譯一直報(bào)錯(cuò)情況:

是因?yàn)槿绻麡?gòu)造函數(shù)中的形參表中并不是const char *,而是char *,它表示了一個(gè)可改變的字符串,即字符變量,但是主函數(shù)中定義對(duì)象時(shí)賦的初值為字符常量,所以產(chǎn)生了矛盾。