不要隨便把構造函數和析構函數的定義放在類聲明裏。Inline不是inline,不會影響構造函數的默認語義,不會因為不是inline就不執行基類的構造。而分析外部的構造函數可能還是內聯的。如果構造函數太復雜,就寫在類定義裏,不會內聯。
我覺得原因是這樣的:C++提倡實現和接口分離,聲明中只給出需要的參數,甚至只給出參數類型,沒有參數。如果在聲明中寫,就不想給函數體,讓大家看到代碼。也許妳可以重寫妳的。h直接然後重新編譯實現對私有成員的直接控制,不利於打包。C++的設計使得通用具體編譯器的實現成為可能。把申報單放進去。中的實現。cpp,編譯生成。obj,並刪除。cpp文件(或者不要分發給用戶)。用戶只需要這個。obj和。他們可以在自己的程序中使用它。如果構造函數直接在類定義內給出代碼,相當於讓用戶隨意更改。它可能比其他通用功能有更多的負面影響。
構造函數、析構函數和虛函數可以內聯嗎?有什麽意義?語法上沒有錯誤。首先要掌握構造函數、析構函數、虛函數都可以聲明為內聯函數,這在語法上是正確的。
當通過指針或引用引用對象時,對虛函數的調用不能內聯,因為調用必須動態解析。原因:堆棧器直到運行時才知道調用哪個實際代碼(即,動態地),因為代碼可能來自調用程序被堆棧後創建的派生類。因此,只有當編譯器知道作為虛函數調用目標的對象的“確切類”時,才能內聯壹個內聯虛函數調用。只有當編譯器擁有壹個實際的對象,而不是壹個指向對象的指針或引用時,才會發生這種情況。也就是說,要麽是局部對象,要麽是全局/靜態對象,要麽是posite中的完全包含的對象。
我想問壹下:編譯器自動生成的合成析構函數做釋放資源的工作嗎?謝謝沒有,如果需要釋放資源,就得自己寫析構函數。
在構造函數中打開數據庫連接。JAVA如何在沒有析構函數的情況下自動關閉子類的構造函數?默認情況下會調用父類的無參構造函數,比如在構造函數public student (string name,intage,string school){ super();這是默認語句,所以不需要調用this.name = namethis.age =年齡;this.school =學校;}
java中誰先加載主函數和構造函數,當然是主函數先。
程序的入口是主要功能。
至於構造器。。只有當妳想用這個類的時候。也就是說,在new從這個類中出來之前,它不會被加載。
我去。後面的人為什麽說構造函數?。。主要功能是靜態的。。剛裝的時候就裝了!
需要壹個帶註釋的c#程序,其中最好註明構造函數、析構函數、屬性等~ ~命名空間gXlogic。
{
公共類GetLogicDisposedList
{
#區域成員變量
公共字符串PeancyTimeL從違反時起
公共字符串PeancyTimeH非法時間已過期。
公共字符串DisposeTimeL處理時間
public string DisposeTimeH處理時間
公共字符串PlateType車牌類型
公共字符串車牌號碼;車牌號碼
公共字符串PeancyAdress非法場所
公共字符串方向;走行方向
公共字符串PeancyType非法活動
公共字符串DisposedPerson處理程序(當數據屬於處理類型-處理程序時)
#結束區域
公共GetLogicDisposedList()
{
PeancyTimeL =
PeancyTimeH =
DisposeTimeL =
DisposeTimeH =
PlateType =
PlateNumber =
PeancyAdress =
Derection =
PeancyType =
DisposedPerson =
}
這是構造函數,析構函數C#很少用。如果妳想了解這個,可以看看C++
編寫類String的構造函數和析構函數。類String的原型已知為:類String { public:String(constcharstring的析構函數。
String::~String(void)
{
刪除[]m _ data;
因為m_data是內部數據類型,所以也可以寫成delete m _ data
}
字符串的普通構造函數
String::String(const char *str)
{
if(str==NULL)
{
m _ data = new char[1];還不如加上空判。
* m _ data = ' \ 0
}
其他
{
int length = strlen(str);
m _ data = new char[長度+1];還不如加上空判。
strcpy(m_data,str);
}
}
復制構造函數
String::String(常量String & amp其他)
{
int length = strlen(other . m _ data);
m _ data = new char[長度+1];還不如加上空判。
strcpy(m_data,other . m _ data);
}
分配函數
弦與弦。String::operate =(const String & amp;其他)
{
檢查自我分配
如果(this = = & amp其他)
返回* this
釋放原來的內存資源。
刪除[]m _ data;
分配新的內存資源並復制內容。
int length = strlen(other . m _ data);
m _ data = new char[長度+1];還不如加上空判。
strcpy(m_data,other . m _ data);
返回對該項目的引用。
返回* this
}
[轉載]為什麽構造函數不能聲明為虛函數?析構函數可以聲明為虛函數,析構函數可以聲明為虛函數,有時也必須聲明為虛函數。
不建議在構造函數和析構函數中調用虛函數。
構造函數之所以不能聲明為虛函數,是因為在構造對象時,1必須知道對象的實際類型,虛函數的行為就是在執行時確定實際類型。構造對象時,因為對象還沒有構造成功。編譯器無法識別該對象。
的實際類型是類本身、類的派生類或更深層次的派生類。不能確定。。。
虛函數的執行依賴於虛函數表。但是
虛函數表在構造函數中初始化
,即初始化vptr指向正確的虛函數表。在對象的構造過程中,虛函數表還沒有初始化。
無法進行初始化。
當編譯器調用基類的構造函數時,它不知道妳是想構造基類的對象還是派生類的對象。
析構函數作為虛函數的作用:解釋:在類繼承中,如果基類指針指向派生類,那麽如果基類指針delete沒有定義為虛函數,那麽派生類的部分就不能被析構。示例:#include "stdafx.h "
# include " stdio . h " class A { public:A();虛擬~ A();};A::A(){}A::~A(){
printf("刪除類APn ");}
B類:public A { public:B();~ B();};B::B(){ }B::~B(){
printf("刪除類BPn ");}
int main(int argc,char* argv[]){
A * b =新B;刪除b;返回0;}
輸出結果是:刪除b類。
刪除A類
如果A的虛被刪除,就變成了Deleteclass A,也就是說派生類中的其余內容不會被刪除,也就是說派生類的虛函數不會被調用。
因此,在類的繼承體系中,如果基類的析構函數沒有聲明為虛函數,很容易造成內存泄漏。所以如果妳設計壹個可能是基類的類,妳必須把它聲明為虛函數。就像Symbian裏的CBase壹樣。
註:1。
如果我們定義了壹個構造函數,編譯器不會為我們生成默認的構造函數。
2.編譯器生成的析構函數是非虛的,除非它是壹個子類,其父類有壹個虛析構函數,在這種情況下,函數的虛特性來自父類。
3.壹個有虛函數的類幾乎肯定會有壹個虛析構函數。
4.如果壹個類不能是基類,就不要將析構函數聲明為虛函數。虛函數消耗空間。5.
析構函數異常退出會導致析構不完全,從而導致內存泄漏。最好提供壹個管理類,在管理類中提供壹個方法來進行析構,調用者會根據這個方法的結果來決定下壹步的操作。6.
不要在構造函數中調用虛函數。構造基類時,虛函數是非虛函數,不會進入派生類,是靜態綁定。顯然,當我們構造壹個子類的對象時,首先調用的是基類的構造函數,子類還沒有被構造和初始化。如果我們在構造基類的時候調用虛函數,那麽調用壹個還沒有初始化的對象是非常危險的,所以在C++中構造父類的對象的時候是不可能調用子類的虛函數實現的。但這並不意味著妳不能寫出那樣的程序。
如果這樣寫,編譯器不會報錯。只是妳這樣寫,編譯器不會為妳調用子類的實現,而是調用基類的實現。7.不要在析構函數中調用虛函數。析構時會先調用子類析構函數來析構對象的子類部分,然後通過調用基類的析構函數來析構基類部分。如果在基類的析構函數中調用虛函數,會導致它調用被析構的子類對象中的函數,這是非常危險的。8.
寫派生類的復制函數時記得調用基類的復制函數來復制基類的部分,不能忘記。
寫壹個復雜的類,裏面有構造函數,析構函數,=操作重載函數和打印函數,測試# include
使用命名空間std
類復合體{
雙實;
雙imag
公共:
復數(double pr=1,double pi=1){
real = primag = pi
cout & lt& lt“建設對象...\ n ";
}
~ Complex(){ cout & lt;& lt“摧毀物體...\ n ";}
復雜& amp運算符=(const Complex & amp;c){
如果(this = = & ampc)
返回* this
real = c.real
imag = c.imag
返回* this
}
void顯示(){
cout & lt& ltreal & lt& lt(imag & gt=0 ?"+":" " " & lt;& ltimag & lt& lt“我”& lt& ltendl
}
};
int main(){
復數c1(3.3,-4.4),C2;
C2 = c 1;
c 1 . display();
C2 . display();
返回0;
}