程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++基本語法:結構函數與析構函數

c++基本語法:結構函數與析構函數

編輯:關於C++

c++基本語法:結構函數與析構函數。本站提示廣大學習愛好者:(c++基本語法:結構函數與析構函數)文章只能為提供參考,不一定能成為您想要的結果。以下是c++基本語法:結構函數與析構函數正文


說真話c++照樣之前在黉捨的時刻用過的,從卒業到如今一向用c嵌入式編程,如今從新搬出C++語法 ,假如懂得上有毛病的處所,還請途經的同伙多斧正~~~

結構函數用來結構一個對象,重要完成一些初始化任務,假如類中不供給結構函數,編譯器會默許的供給一個默許結構函數(參數為空的結構函數就是默許結構函數) ;析構函數是隱式挪用的,delete對象時刻會主動挪用完成對象的清算任務。

如今重要看看繼續中的結構函數和析構函數的挪用:

class  A {} ;
class  B : public A
{};
class  C : public B
{};

c * ptr = new C() ;
delete ptr ;

普通來講,下面的代碼結構函數是先挪用最根父類的結構函數,然後是次一級父類結構函數,順次而來直到派生類自己的結構函數,並且對父類結構函數的挪用都是父類的默許結構函數(固然也能夠顯示地挪用父類的非默許結構函數),也就是說派生類在結構自己之前會起首把繼續來的父類成份先結構好;

對析構函數的挪用是先挪用派生類自己的析構函數,然後是上一層父類析構函數,直到根父類析構函數 ,當沒有多態的時刻,析構函數是如許挪用的。

改一下下面的代碼:
A * ptr = new C() ;
delete ptr ;
在多態的情形下,假如基類A中的析構函數不是虛擬造函數,則當delete ptr的時刻只會挪用A的析構函數,不會挪用B和C中的析構函數;假如A中的析構函數是虛擬造函數就會挪用一切的析構函數,挪用次序和普通情形一樣。

再改一下下面的代碼:
B *prt = new C();
delete ptr ;
在多態的情形下,假如A,B中的析構函數都不是虛析構函數,則當delete ptr的時刻先挪用B的析構函數,再調A的析構函數,不會挪用C中的析構函數,假如A或許B中至多有一個是虛析構函數,則析構函數挪用和普通情形一樣。

是以總結一下紀律:
CA * ptr = new CB() ;
delete ptr ;
CB是CA的子類,結構函數的挪用一向是一樣的,當具有多態的時刻:
假如CA及其父類都不具有虛析構函數,則起首挪用A的析構函數,然後挪用A的父類析構函數直到根父類析構函數,不會挪用A以下直到派生類的析構函數 ;假如假如CA及其父類只需有一個具有虛析構函數,則析構函數挪用跟普通情形一樣。

是以:帶有多態性質的基類應當聲明虛析構函數 ,如許的基類普通還有其他虛函數;
假如類的設計不是用於基類,並且不具有多態性,則析構函數不該該聲明為虛析構函數

小測試代碼:

#include<iostream>
using namespace std ;

class A
{
public:
A(){cout<<"A constructor"<<endl;}
A(char * arp) { cout <<"not default " ;}

~CA(){cout<<"A desstructor"<<endl;}

};

class B:public A
{
public:
B(){cout<<"B constructor"<<endl;}

~B(){cout<<"B desstructor"<<endl;}
};

class C:public B
{
public:
C(char * arp){cout<<"C constructor"<<endl;}

~C(){cout<<"C desstructor"<<endl;}
};
int main()
{
C * ptr = new C("hello world") ;
delete ptr ;
}

別的effective C++中提到的:
1、析構函數不克不及吐出異常,假如析構函數失落用的函數能夠發生異常,要在析構函數外部停止捕捉停止處置,由於假如析構函數拋出異常的話,好比說vector,當挪用各個對象的析構函數停止刪除的時刻能夠招致拋出多個異常,從而使法式進入不肯定狀況。

2、假如用戶須要對某個操作函數運轉時代拋出的異常作出反響,那末class應當供給一個通俗函數履行這個操作。

3、在結構函數和析構函數中都不該該挪用虛函數,這是由於當挪用結構函數結構對象的時刻,起首會挪用父類的結構函數,此時對象的類型在編譯器看來就是一個父類對象(現實此時子類成員還處於不肯定狀況),會挪用父類的虛函數,而不會挪用子類的虛函數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved