史小飛 宮彥軍
?
《C++程序設(shè)計(jì)》課程中構(gòu)造函數(shù)的教學(xué)改革探索
史小飛1宮彥軍2
(1.湖南科技學(xué)院 圖書館,湖南 永州 425199;2.湖南科技學(xué)院 電子與信息工程學(xué)院,湖南 永州 425199)
在《C++程序設(shè)計(jì)》教學(xué)中構(gòu)造函數(shù)部分是重要的教學(xué)內(nèi)容,文章設(shè)計(jì)了構(gòu)造函數(shù)的引入,講解構(gòu)造函數(shù)的作用,深入講解類在沒有默認(rèn)構(gòu)造函數(shù)時(shí),如何開辟動(dòng)態(tài)對(duì)象數(shù)組,補(bǔ)充課本中沒有的構(gòu)造函數(shù)可以用來修改數(shù)據(jù)成員的內(nèi)容,用構(gòu)造函數(shù)可以修改常數(shù)據(jù)成員。
C++語言;構(gòu)造函數(shù);調(diào)用
C++語言支持面向?qū)ο?,含有類,類中的?gòu)造函數(shù)是一種特殊的成員函數(shù),其作用是為類的數(shù)據(jù)成員賦初值[1-4]。在C++中構(gòu)造函數(shù)的作用就是在對(duì)象被創(chuàng)建時(shí)利用特定的值構(gòu)造對(duì)象[5]。C++中每個(gè)類必須有構(gòu)造函數(shù),如果用戶沒有提供構(gòu)造函數(shù),C++提供一個(gè)無參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對(duì)象,而不做任何初始化的工作[6]。構(gòu)造函數(shù)中有默認(rèn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和轉(zhuǎn)換構(gòu)造函數(shù)[7]。以上文獻(xiàn)都是給出構(gòu)造函數(shù)的概念、分類及作用,本文給出《C++程序設(shè)計(jì)》中構(gòu)造函數(shù)部分教學(xué)的設(shè)計(jì)過程,對(duì)此部分內(nèi)容進(jìn)行教學(xué)改革與探索。
1.1無參構(gòu)造函數(shù)的引入
給學(xué)生演示下面的例子“程序一”,代碼如下:
#include
using namespace std;
class Time
{
public:
void set_time(); void show_time();
private:
int hour,minute,sec;
};
void Time::show_time()
{
cout< } int main() { int a; cout< Time t1; t1.show_time(); return 0; } 問學(xué)生,這程序的輸出結(jié)果是什么?演示程序,程序給出的結(jié)果是事先不可預(yù)知的,是隨機(jī)值,a的輸出是隨機(jī)值,因?yàn)闆]有初始化,而時(shí)間類的數(shù)據(jù)成員的輸出也是隨機(jī)值,說明沒有初始化,對(duì)象的數(shù)據(jù)成員如何初始化?和學(xué)生互動(dòng),對(duì)學(xué)生進(jìn)行啟發(fā),能否在定義數(shù)據(jù)成員進(jìn)行初始化,即能否在定義數(shù)據(jù)成員的同時(shí)賦值? 修改上面的代碼 int hour=0,minute=0,sec=0; 編譯時(shí)會(huì)出現(xiàn)6個(gè)錯(cuò)誤。那如何初始化,就引入構(gòu)造函數(shù)概念。把數(shù)據(jù)成員都初始化為固定的值,例如上面的Time類的hour、minute和sec都初始化為0。在Time類中“private:”前面補(bǔ)充如下代碼: Time() { hour=0;minute=0;sec=0; } 這個(gè)程序?yàn)椤俺绦蚨薄?/p> 主函數(shù)中的a初始化為0,則程序的執(zhí)行結(jié)果如下: 圖1.程序二的運(yùn)行結(jié)果 通過無參構(gòu)造函數(shù),引入構(gòu)造函數(shù)的概念,構(gòu)造函數(shù)是特殊的成員函數(shù),它的名字與類名相同,沒有返回值類型,在建立對(duì)象時(shí)自動(dòng)執(zhí)行。 1.2有參構(gòu)造函數(shù)的引入 類名后面跟著對(duì)象名,定義對(duì)象時(shí)調(diào)用無參構(gòu)造函數(shù),通過無參構(gòu)造函數(shù)定義對(duì)象時(shí),對(duì)象數(shù)據(jù)成員的初始化是固定,如果想定義2個(gè)不同的對(duì)象,對(duì)象的數(shù)據(jù)成員的初始化的值不同,如何處理?這樣引入有參構(gòu)造函數(shù)。對(duì)于上面的Time類需要對(duì)三個(gè)數(shù)據(jù)成員初始化,需要一個(gè)三參構(gòu)造函數(shù),在Time類中“private:”前面補(bǔ)充如下代碼: Time(int h,int m,int s) { hour=h;minute=m;sec=s; } 主函數(shù)修改如下,為程序三: int main() { Time t1(1,2,3); t1.show_time(); return 0; } 運(yùn)行程序,執(zhí)行結(jié)果如下: 圖2.“程序三”的運(yùn)行結(jié)果 對(duì)于上面的時(shí)間類的三參構(gòu)造函數(shù)的使用,是在定義對(duì)象的時(shí)候提供三個(gè)參數(shù),對(duì)象名的后面用括號(hào)括起的三個(gè)參數(shù),為什么這樣寫?Time t1(1,2,3)可以寫成 Time t1=Time(1,2,3) 這樣可以理解為,定義對(duì)象也像普通的double型數(shù)的初始化一樣進(jìn)行賦值,這里的賦值是調(diào)用三參構(gòu)造函數(shù)進(jìn)行賦值,“Time t1(1,2,3)”這樣寫是省略了“=Time”。 對(duì)象的動(dòng)態(tài)數(shù)組,利用對(duì)象指針來實(shí)現(xiàn),給學(xué)生演示下面的例子“程序四”,代碼如下: #include #include using namespace std; class Box { public: Box(int h,int w,int len) { height=h; width=w; length=len; } void output() { cout<<"V="< int volume() { return(height*width*length); } private: int height,width,length; }; int main() { int n; cout<<"長(zhǎng)方體的個(gè)數(shù):"; cin>>n; Box *pt; pt=new Box[n]; for(int i=0;i cout< delete[]pt; return 0; } “程序四”編譯后,會(huì)出現(xiàn)如下錯(cuò)誤: error C2512: 'Box' : no appropriate default constructor available 這個(gè)錯(cuò)誤的原因是類Box沒有無參構(gòu)造函數(shù)。解決辦法一是增加無參構(gòu)造函數(shù),辦法二是修改開辟動(dòng)態(tài)數(shù)組的方法,對(duì)“pt=new Box[n]”進(jìn)行修改,得到“程序五”,修改如下: pt=(Box*)operator new(sizeof(Box)*n); 用operator new開辟動(dòng)態(tài)數(shù)組,對(duì)象數(shù)組的每個(gè)元素的數(shù)據(jù)成員都是隨機(jī)值。 圖3“程序五”的運(yùn)行結(jié)果 “程序五”給出的結(jié)果是隨機(jī)值,這是因?yàn)閿?shù)組的每個(gè)元素的數(shù)據(jù)成員都是隨機(jī)值,可以利用構(gòu)造函數(shù)對(duì)動(dòng)態(tài)數(shù)組中元素中數(shù)據(jù)成員進(jìn)行設(shè)置。 修改“程序五”中的主函數(shù),得到“程序六”,“程序六”與“程序五”的區(qū)別只是主函數(shù)不同,“程序六”主函數(shù)如下。 int main() { int n,i; cout<<"長(zhǎng)方體的個(gè)數(shù):"; cin>>n; Box *pt; pt=(Box*)operator new(sizeof(Box)*n); for(i=0;i { int a,b,c; cout<<"輸入長(zhǎng)寬高(整數(shù))"; cin>>a>>b>>c; new(pt+i)Box(a,b,c); } for(i=0;i cout< delete[]pt; return 0; } 圖4.“程序六”的運(yùn)行結(jié)果 從“程序六”的代碼可以看出,可以利用構(gòu)造函數(shù)修改數(shù)據(jù)成員。 給學(xué)生演示下面的例子“程序七”,代碼如下: #include using namespace std; class Time { public: void show_time() { cout< Time(int h,int m,int s):hour(h) { minute=m;sec=s;} private: const int hour; int minute,sec; }; int main() { Time t(1,2,3); return 0; } 對(duì)于常數(shù)據(jù)成員必須且只能在構(gòu)造函數(shù)的參數(shù)初始化表里面進(jìn)行初始化。只是修改“程序七”的主函數(shù)得到“程序八”,“程序八”的主函數(shù)如下: int main() { Time t(1,2,3); t.show_time(); new(&t)Time(0,0,0); t.show_time(); return 0; } 圖5.“程序八”的運(yùn)行結(jié)果 從“程序八”的運(yùn)行結(jié)果可以看出,Time對(duì)象的常數(shù)據(jù)成員發(fā)生變化,hour為常數(shù)據(jù)成員,從1變?yōu)?. 設(shè)計(jì)了《C++程序設(shè)計(jì)》課程中構(gòu)造函數(shù)部分采用啟發(fā)式教學(xué)方案,文章通過實(shí)際的例子引入構(gòu)造函數(shù),逐步引出在沒有默認(rèn)構(gòu)造函數(shù)時(shí),開辟動(dòng)態(tài)對(duì)象數(shù)組的方法,補(bǔ)充課本中沒有的構(gòu)造函數(shù)可以用來修改數(shù)據(jù)成員的內(nèi)容,用構(gòu)造函數(shù)可以修改常數(shù)據(jù)成員。 [1]梁伍七.C++構(gòu)造函數(shù)構(gòu)造類成員的方法剖析[J].安徽廣播電視大學(xué)學(xué)報(bào),2002,(01):86-88. [2]程有娥.C++構(gòu)造函數(shù)構(gòu)造類成員的方法剖析[J].華北工學(xué)院學(xué)報(bào)(社科版),2003,(03):91-92. [3]宋初一,格日樂圖,姜靜清,等.C++構(gòu)造函數(shù)的剖析[J].內(nèi)蒙古民族大學(xué)學(xué)報(bào)(自然科學(xué)版),2003,(06):502-503. [4]莊銀霞.關(guān)于C++構(gòu)造函數(shù)中的不合理設(shè)計(jì)的研究[J].信息技術(shù)與信息化,2015,(10):139-141. [5]張勇.C++中構(gòu)造函數(shù)與析構(gòu)函數(shù)的使用[J].宿州教育學(xué)院學(xué)報(bào),2004,(03):107-108+133. [6]張永,葉水生,張小鋒.C++中構(gòu)造函數(shù)的深入分析[J].計(jì)算機(jī)與現(xiàn)代化,2005,(02):14-15+21. [7]王帥,馬夢(mèng)娜.關(guān)于C++構(gòu)造函數(shù)的幾點(diǎn)探究[J].電腦編程技巧與維護(hù),2013,(10):6-7+19. (責(zé)任編校:何俊華) 2016-01-08 湖南省教育廳資助科研項(xiàng)目(12A054) 史小飛(1970-),女,吉林梨樹人,助理館員,研究方向?yàn)閳D書館學(xué)、情報(bào)學(xué)、計(jì)算機(jī)程序設(shè)計(jì)。 G642.0 A 1673-2219(2016)05-0105-032 動(dòng)態(tài)對(duì)象數(shù)組
3 利用構(gòu)造函數(shù)修改對(duì)象的數(shù)據(jù)成員
4 利用構(gòu)造函數(shù)修改常數(shù)據(jù)成員
結(jié) 論
湖南科技學(xué)院學(xué)報(bào)2016年5期