歡迎來到天天文庫
瀏覽記錄
ID:26413130
大?。?0.18 KB
頁數:14頁
時間:2018-11-26
《類及構造函數和析構函數》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、C++面向對象編程入門:構造函數與析構函數 請注意,這一節(jié)內容是c++的重點,要特別注意! 我們先說一下什么是構造函數?! ∩弦粋€教程我們簡單說了關于類的一些基本內容,對于類對象成員的初始化我們始終是建立成員函數然后手工調用該函數對成員進行賦值的,那么在c++中對于類來說有沒有更方便的方式能夠在對象創(chuàng)建的時候就自動初始化成員變量呢,這一點對操作保護成員是至關重要的,答案是肯定的。關于c++類成員的初始化,有專門的構造函數來進行自動操作而無需要手工調用,在正式講解之前先看看c++對構造函數的一個基本定義?! ?.C++規(guī)
2、定,每個類必須有默認的構造函數,沒有構造函數就不能創(chuàng)建對象?! ?.若沒有提供任何構造函數,那么c++提供自動提供一個默認的構造函數,該默認構造函數是一個沒有參數的構造函數,它僅僅負責創(chuàng)建對象而不做任何賦值操作。 3.只要類中提供了任意一個構造函數,那么c++就不在自動提供默認構造函數?! ?.類對象的定義和變量的定義類似,使用默認構造函數創(chuàng)建對象的時候,如果創(chuàng)建的是靜態(tài)或者是全局對象,則對象的位模式全部為0,否則將會是隨即的。 我們來看下面的代碼:#includeusingnamespacestd
3、;classStudent{public:Student()//無參數構造函數{number=1;score=100;}voidshow();protected:intnumber;intscore;};voidStudent::show(){cout<4、如果去掉Student()函數體內的代碼那么它和c++的默認提供的構造函數等價的。 構造函數可以帶任意多個的形式參數,這一點和普通函數的特性是一樣的! 下面我們來看一個帶參數的構造函數是如何進行對象的始化操作的?! 〈a如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name)//有參數的構造函數{name=newchar[10];//name=input_name;//這樣賦值是錯誤的strcpy(name,i5、nput_name);}voidshow();protected:char*name;};voidTeacher::show(){cout<6、同,因為構造函數是為創(chuàng)建對象而設立的,這里的意義不單純是調用函數,而是創(chuàng)建一個類對象?! ∫坏╊愔杏辛艘粋€帶參數的構造函數而又沒無參數構造函數的時候系統將無法創(chuàng)建不帶參數的對象,所以上面的代碼Teachera; 就是錯誤的?。?! 這里還有一處也要注意://name=input_name;//這樣賦值是錯誤的 因為name指是指向內存堆區(qū)的,如果使用name=input_name;會造成指針指向改變不是指向堆區(qū)而是指向棧區(qū),導致在后面調用析構函數delete釋放堆空間出錯!(析構函數的內容我們后面將要介紹) 如果需要7、調用能夠執(zhí)行就需要再添加一個沒有參數的構造函數 對上面的代碼改造如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//這樣賦值是錯誤的strcpy(name,input_name);}Teacher()//無參數構造函數,進行函數重載{}voidshow();protected:char*name;};voidTeacher::show8、(){cout<
4、如果去掉Student()函數體內的代碼那么它和c++的默認提供的構造函數等價的。 構造函數可以帶任意多個的形式參數,這一點和普通函數的特性是一樣的! 下面我們來看一個帶參數的構造函數是如何進行對象的始化操作的?! 〈a如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name)//有參數的構造函數{name=newchar[10];//name=input_name;//這樣賦值是錯誤的strcpy(name,i
5、nput_name);}voidshow();protected:char*name;};voidTeacher::show(){cout<6、同,因為構造函數是為創(chuàng)建對象而設立的,這里的意義不單純是調用函數,而是創(chuàng)建一個類對象?! ∫坏╊愔杏辛艘粋€帶參數的構造函數而又沒無參數構造函數的時候系統將無法創(chuàng)建不帶參數的對象,所以上面的代碼Teachera; 就是錯誤的?。?! 這里還有一處也要注意://name=input_name;//這樣賦值是錯誤的 因為name指是指向內存堆區(qū)的,如果使用name=input_name;會造成指針指向改變不是指向堆區(qū)而是指向棧區(qū),導致在后面調用析構函數delete釋放堆空間出錯!(析構函數的內容我們后面將要介紹) 如果需要7、調用能夠執(zhí)行就需要再添加一個沒有參數的構造函數 對上面的代碼改造如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//這樣賦值是錯誤的strcpy(name,input_name);}Teacher()//無參數構造函數,進行函數重載{}voidshow();protected:char*name;};voidTeacher::show8、(){cout<
6、同,因為構造函數是為創(chuàng)建對象而設立的,這里的意義不單純是調用函數,而是創(chuàng)建一個類對象?! ∫坏╊愔杏辛艘粋€帶參數的構造函數而又沒無參數構造函數的時候系統將無法創(chuàng)建不帶參數的對象,所以上面的代碼Teachera; 就是錯誤的?。?! 這里還有一處也要注意://name=input_name;//這樣賦值是錯誤的 因為name指是指向內存堆區(qū)的,如果使用name=input_name;會造成指針指向改變不是指向堆區(qū)而是指向棧區(qū),導致在后面調用析構函數delete釋放堆空間出錯!(析構函數的內容我們后面將要介紹) 如果需要
7、調用能夠執(zhí)行就需要再添加一個沒有參數的構造函數 對上面的代碼改造如下:#includeusingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//這樣賦值是錯誤的strcpy(name,input_name);}Teacher()//無參數構造函數,進行函數重載{}voidshow();protected:char*name;};voidTeacher::show
8、(){cout<
此文檔下載收益歸作者所有