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

2 動態對象數組

3 利用構造函數修改對象的數據成員

4 利用構造函數修改常數據成員

結 論