摘要:但是在中就只是聲明,但是還沒有分配空間,中的才是分配了內(nèi)存的。對于語言會報錯這樣是對的詳細說明原因只能是或者是沒有這個是中的語法,所以要區(qū)分和的語法和機制如果用聲明了對象會報錯這才是正確的語法
C++中創(chuàng)建對象的兩種語法
在c++的類中,我如果要訪問類中的成員變量或函數(shù),有2種方法,第一種就是定義一個一個對象,如:
Class A ... A aa; aa.xxx();
另外一種就是
Class B ... B *aa = new B(); aa->xxx();Java、C++、Delphi中創(chuàng)建對象
在java中,A a = new A();等同于c++中的 A a;
另外在c++中還有另外一種聲明和實例化就是使用指針,如:A* a= new A();,在Java中沒有對應(yīng)的形式,最重要的原因是C++中的這種聲明形式的內(nèi)存是需要程序員手動管理的,但是Java有內(nèi)存回收機制,不需要程序員關(guān)心對象的內(nèi)存的問題。
上面是從內(nèi)存回收的角度看,這時候:在java中,A a = new A();等同于c++中的 A a;
但是假如從創(chuàng)建對象的時間來看:在java中,A a = new A();也可以看成等同于c++中的 A *a = New A();
c++中的A a;就已經(jīng)構(gòu)造了對象。但是在java中 A a; 就只是聲明,但是還沒有分配空間,java中的A a = new A()才是分配了內(nèi)存的。而C++中的A *a;也只是聲明了一個指針,但是還沒有分配指針,a = new A();才是創(chuàng)建了一個實體,并且另指針a指向這個實體的內(nèi)存地址!
再說說Delphi,假如有一個類ClassA,然后聲明一個對象,代碼大概如下:
var ObjectA: ClassA; //這里只是聲明了一個變量名,Delphi中變量名其實就是一個指針,此時并沒有分配空間 begin ObjectA:= ClassA.Create; //這里才是創(chuàng)建了一個內(nèi)存實體,分配了內(nèi)存空間,并且令ObjectA指向這塊內(nèi)存地址 //注意這里的語法格式不同于C++的ClassA *ObjectA = new ClassA(); //也不同于Java的ClassA ObjectA = new ClassA(); //注意區(qū)別三者的語法格式的不同 end;
在Delphi的面向?qū)ο蟮恼Z法中,要注意理解Delphi對象名與對象實體的本質(zhì)區(qū)別,一個Delphi的對象的對象名其實本質(zhì)上就是一個指針,指向內(nèi)存中的對象實體。
C++的靜態(tài)與動態(tài)內(nèi)存分配在C++中就非常的靈活,A a;是在棧(stack)上分配空間,是靜態(tài)的。而A * a= new A;是在堆(heap)上分配空間,是動態(tài)的。棧上空間自動回收,堆空間需要程序員手動回收
靜態(tài)分配內(nèi)存適合于編譯時就已經(jīng)可以確定需要占用內(nèi)存多少的情況,而在編譯時不能確定內(nèi)存需求量時可使用動態(tài)分配內(nèi)存;但靜態(tài)分配內(nèi)存的運行效率要比動態(tài)分配內(nèi)存的效率要高,因為動態(tài)內(nèi)存分配與釋放需要額外的開銷;動態(tài)內(nèi)存管理水平嚴(yán)重依賴于程序員的水平,如果處理不當(dāng)容易造成內(nèi)存泄漏。
動、靜態(tài)內(nèi)存分配比較可以知道動態(tài)內(nèi)存分配相對于靜態(tài)內(nèi)存分配的特點:
1)不需要預(yù)先分配存儲空間;
2)分配的空間可以根據(jù)程序的需要擴大或縮小。
對于C++語言:
A a =new A(); //會報錯 A *a=new A(); //這樣是對的
詳細說明原因:
//只能是 A a; //或者是 A *a = new A(); //沒有 A a = new A(); //這個是Java中的語法,所以要區(qū)分C++和Java的語法和機制
如果用A* a = new A();聲明了對象
a.run(); //會報錯 a->run(); //這才是正確的語法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64485.html
摘要:靜態(tài)變量是被泛型類的所有實例所共享的。所以引用能完成泛型類型的檢查。對于這個類型系統(tǒng),有如下的一些規(guī)則相同類型參數(shù)的泛型類的關(guān)系取決于泛型類自身的繼承體系結(jié)構(gòu)。事實上,泛型類擴展都不合法。 前言 和C++以模板來實現(xiàn)靜多態(tài)不同,Java基于運行時支持選擇了泛型,兩者的實現(xiàn)原理大相庭徑。C++可以支持基本類型作為模板參數(shù),Java卻只能接受類作為泛型參數(shù);Java可以在泛型類的方法中取得...
摘要:老實說,當(dāng)時一進入世界的大門就暈了,各種規(guī)范概念和英文縮寫詞能把人整的暈暈乎乎。等新的英文縮寫又出現(xiàn)了,一口老血還沒來得及噴出,又重新振作開始新的學(xué)習(xí)征程。 showImg(http://upload-images.jianshu.io/upload_images/1131767-1c5d16e39435df10.jpg?imageMogr2/auto-orient/strip%7Ci...
摘要:效率比較低,依賴解釋器,跨平臺性好語言編譯執(zhí)行過程下面都是鳥哥博客的內(nèi)容深入理解原理之引擎對這個文件進行詞法分析,語法分析,編譯成,然后執(zhí)行。 編譯型語言和解釋型語言 從PHP,Java和C語言的編譯執(zhí)行過程可以先解釋下編譯型語言和解釋型語言。 編譯型語言 程序在執(zhí)行之前需要一個專門的編譯過程,把程序編譯成為機器語言的文件,運行時不需要重新翻譯,直接使用編譯的結(jié)果就行了。程序執(zhí)行效率高...
摘要:效率比較低,依賴解釋器,跨平臺性好語言編譯執(zhí)行過程下面都是鳥哥博客的內(nèi)容深入理解原理之引擎對這個文件進行詞法分析,語法分析,編譯成,然后執(zhí)行。 編譯型語言和解釋型語言 從PHP,Java和C語言的編譯執(zhí)行過程可以先解釋下編譯型語言和解釋型語言。 編譯型語言 程序在執(zhí)行之前需要一個專門的編譯過程,把程序編譯成為機器語言的文件,運行時不需要重新翻譯,直接使用編譯的結(jié)果就行了。程序執(zhí)行效率高...
閱讀 1448·2021-11-25 09:43
閱讀 2048·2021-07-26 23:38
閱讀 753·2019-08-30 15:53
閱讀 2290·2019-08-30 15:43
閱讀 1185·2019-08-29 18:40
閱讀 1982·2019-08-26 13:28
閱讀 1987·2019-08-23 18:20
閱讀 557·2019-08-23 15:07