c++之建構函式和解構函式
1、 建構函式:
(1)定義:
1)C++中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式;
2)建構函式在定義時可以有引數;
3)沒有任何返回型別的宣告。
(2)呼叫:
自動呼叫:一般情況下C++編譯器會自動呼叫建構函式
手動呼叫:在一些情況下則需要手工呼叫建構函式
(3)例子程式碼:
#include <stdio.h> class test { public: test() { m_a = 10; m_b = 20; printf("無參建構函式被呼叫\n"); } test(int a) { m_a = a; printf("1個引數的建構函式被呼叫\n"); } test(int a, int b) { m_b = b; printf("2個引數的建構函式被呼叫\n"); } private: int m_a; int m_b; }; int main() { test t1; test t2(1, 2); test t3 = 100; test t4 = test(20, 30); return 0; }
2、解構函式
(1)定義:
1)C++中的類可以定義一個特殊的成員函式清理物件,這個特殊的成員函式叫做解構函式。 語法:~ClassName();
2)解構函式沒有引數也沒有任何返回型別的宣告;
3)解構函式在物件銷燬時自動被呼叫。
(2)呼叫:c++編譯器自動呼叫。
(3)例子程式碼:
#include <stdio.h> #include <stdlib.h> #include <string.h> class test5_1 { public: test5_1() { printf("呼叫建構函式\n"); } ~test5_1() { printf("呼叫解構函式\n"); } private: int m_a; }; int main5_1() { test5_1 t1; return 0; } class test5_2 { public: test5_2() { m_name = (char *)malloc(sizeof(char) * 20); printf("建構函式被呼叫!\n"); } ~test5_2() { if (m_name != NULL) { free(m_name); m_name = NULL; } printf("解構函式被呼叫!\n"); } private: char *m_name; }; int main() { test5_2 t1; printf("--------------------------------\n"); return 0; }
相關推薦
【C++】類的六大預設的成員函式 之 解構函式以及建構函式和解構函式的呼叫順序
解構函式 一.解構函式定義 解構函式也是特殊的成員函式,他的作用和建構函式相反。 class Box { public: //建構函式 Box(i
c++之建構函式和解構函式
1、 建構函式: (1)定義: 1)C++中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做建構函式; 2)建構函式在定義時可以有引數; 3)沒有任何返回型別的宣告。 (2)呼叫: 自動呼叫:一般情況下C++編譯器會自動呼叫建構函式 手動呼叫:在一些情況
C++之派生類的建構函式和解構函式呼叫順序
派生類的建構函式只負責對派生類新增的成員進行初始化,對所有從基類繼承下來的成員,其初始化工作還是由基類的建構函式完成。 派生類的資料成員是由所有基類的資料成員與派生類新增的資料成員共同組成的。如果派生類新增資料成員中包括有內嵌的其他類物件,派生類的資料成員中實際上還間接包括
C++學習--建構函式和解構函式
建構函式是對物件進行初始化的成員函式,建構函式的名字和類的名字是一樣的,建構函式不用特定的呼叫,是在類例項化中,自動呼叫。建構函式可以有多個,也就是可以進行建構函式過載,例項化過程中會根據建構函式的引數型別、個數進行呼叫。解構函式和建構函式相反,是完成一些清理工作,比如釋放記憶體或者其他的工作。解構
C++建構函式和解構函式什麼情況下會用
解構函式: 1. 物件生命週期結束,被銷燬時; 2. delete 指向物件的指標時; 3. delete 指向基類物件的指標時,其解構函式是虛擬函式; 4. 在巢狀關係中,物件A是物件B的成員,當物件B執行解構函式時,物件A的解構函式也會被呼叫; 建構函式: 1. 在宣告一個普通物件
派生類的建構函式和解構函式(C++學習筆記 32)
引入繼承的目的:①派生類繼承了基類的成員,實現了原有程式碼的重用。②實現程式碼的擴充,只有在派生類中通過新增新的成員,加入新的功能,類的派生才有實際意義。 基類的建構函式和解構函式不能被繼承,在派生類中,如果對派生類新增的成員進行初始化,就需要加入派生類的建構函式,同時,對所有從基類
提高C++效能的程式設計技術筆記:建構函式和解構函式+測試程式碼
物件的建立和銷燬往往會造成效能的損失。在繼承層次中,物件的建立將引起其先輩的建立。物件的銷燬也是如此。其次,物件相關的開銷與物件本身的派生鏈的長度和複雜性相關。所建立的物件(以及其後銷燬的物件)的數量與派生的複雜度成正比。 並不是說繼承根本上就是程式碼效能的絆腳石。我們必須區分全部計算開銷、
C++中的建構函式和解構函式
1:建構函式 處理物件的初始化。特殊的成員函式,不需要使用者來呼叫,而是在建立物件的時候自動執行。 特點: ①與類名相同 ②沒有任何返回型別 ③定義時可以有引數,可以無引數 2:解構函式 語法 :~cl
C++中 建構函式和解構函式能不能被顯示呼叫
程式碼: view plaincopy to clipboardprint?#include <iostream> using namespace std; class A { public: A() {
C++進階--建構函式和解構函式中的虛擬函式
//############################################################################ /* 任何時候都不要在建構函式或解構函式中呼叫虛擬函式 */ class dog { public: string m_name
C++建構函式和解構函式--從常見的面試題說起系列1
class A { public: A(){a=0} virtual ~A(){printf "aaa";}} private: int a; } class B: public A { public: B(){a=2
C#—建構函式和解構函式
一、前言 作為比C更先進的語言,C#提供了更好的機制來增強程式的安全性,C#編譯器具有嚴格的型別安全檢查功能,它幾乎能找出程式中所有的語法問題,但是程式通過了編譯檢查並不表示錯誤已經不存在了,不少難以察覺的程式錯誤是由於變數沒有被正確初始化或清除造成的,而初
C++ 建構函式和解構函式與virtual關鍵字
一、建構函式 1.建構函式任何時候都不可以宣告為虛擬函式,原因如下:1)虛擬函式的呼叫軍需通過虛擬函式表vtable來呼叫,虛擬函式表是儲存在記憶體空間的,在呼叫建構函式前,物件還未被實力化,也就沒有
C++知識點10:建構函式和解構函式
建構函式: 生成物件時呼叫建構函式 生成派生類物件時先呼叫基類建構函式在呼叫派生類建構函式 #include <iostream> using namespace std; class base { public: base(){
C++中建構函式和解構函式丟擲異常問題
一. 丟擲異常 1.1 丟擲異常(也稱為拋棄異常)即檢測是否產生異常,在C++中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異常。 該語句的格式為: throw 表示式; 如果在try語句塊的程式段中(包括在其中呼叫的函式)發現了異常,且拋棄了
C++派生類的建構函式和解構函式執行順序及其構造形式
在C++程式設計師的面試中,經常會出現派生類與基類的建構函式、解構函式的執行順序。其實這是一個很基本的問題,沒有什麼難度,只需要記住就OK了。 1.派生類的建構函式和解構函式的執行順序 首先執行基類的建構函式,隨後執行派生類的建構函式,當撤銷派生類物件時,限執行派生類的解構函
c++中,類 和 類中成員(物件)的建構函式和解構函式的執行順序
#include <iostream> using namespace std; class b{ public: b(){ cout<<"b gou zao han shu"<<endl; } ~b(){ cout<
c++建構函式和解構函式的區別?
建構函式:什麼是建構函式?通俗的講,在類中,函式名和類名相同的函式稱為建構函式。它的作用是在建立一個物件時,作某些初始化的工作(例如對資料賦予初值)。C++允許同名函式,也就允許在一個類中有多個建構函式。如果一個都沒有,編譯器將為該類產生一個預設的建構函式。建構函式上惟一的
C++習題——橢圓類(拷貝建構函式和解構函式)
Description(1)拷貝(複製)建構函式的實現。在上一題(橢圓類——1)的基礎上,增加一個拷貝建構函式。函式原型格式:Ellipse(const Ellipse & e);(2)增加Show()函式,顯示橢圓的外切矩形的頂點座標。(3)增加一個成員函式Fun(
(C++)C++類繼承中的建構函式和解構函式
#include <iostream> using namespace std; class Shape{ public: void Draw() {cout<<"Base::Draw()"<<endl;} void Erase() {co