C和C++和java的差別?
①c是面向過程的語言,cpp和java是面向對象的語言。這是他們最本質的差別。
②C和cpp是直接編譯運作,java是在虛拟機中運作的。
③指針的方面,c和c++可以直接用指針來通路記憶體,java沒有指針。
C++裡的結構體和類的差別:
結構體預設通路權限全是public
類通路權限是public 、private、protected,預設通路權限是private
Stl含義:
标準模闆庫Standard Template Library是容器和算法的集合
eg:Vector(向量)、stack(棧)、set(集合)、queue(隊列)、map(哈希表)
指針和引用的差別?
①指針是存儲變量位址的變量。
②引用在函數傳參的時候用到。引用本身也是位址,在傳遞的時候不是值,傳的是位址。
面向對象的三大特性
封裝:是把成員變量和成員函數封裝進一個類并賦予它一些權限。
繼承:首先要有一個基類,然後派生類繼承基類,派生類能繼承基類的成員變量和成員函數。
多态:多态就是同一個接口,使用不同的執行個體而執行不同操作。簡單的說,一個接口,多種實作方式。Eg:函數重載。
編譯一個程式記憶體分為哪兩部分?
堆記憶體和棧記憶體。
關鍵字和辨別符的差別?
辨別符是變量名。比如a、b、c…
關鍵字是new、delete、int、break…
運算符重載和函數重載的差別?
運算符本身也是函數,運算符包涵單目和雙目運算符。
如果運算符重載的話需要參數數量的問題。
重載和重寫?
++重寫(override覆寫)++:如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫。
++重載++:如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱為方法的重載
方法的重寫(Overriding)和重載(Overloading)是Java多态性的不同表現。
重寫(Overriding)是父類與子類之間多态性的一種表現,而重載(Overloading)是一個類中多态性的一種表現。
全局變量(global variable)和局部變量(local variable)的差別?
- 作用域不同:全局變量的作用域為整個程式,而局部變量的作用域為目前函數或循環等
- 記憶體存儲方式不同:全局變量存儲在堆區中,局部變量存儲在棧區
- 生命期不同:全局變量的生命期和主程式一樣,随程式的銷毀而銷毀,局部變量在函數内部或循環内部,随函數的退出或循環退出就不存在了
- 使用方式不同:全局變量在聲明後程式的各個部分都可以用到,但是局部變量隻能在局部使用。函數内部會優先使用局部變量再使用全局變量
構造函數和析構函數是幹什麼的?
構造:對象執行個體化的時候自動運作的函數,進行對象初始化。
析構:撤銷對象的時候會自動運作的函數,可以是釋放對象配置設定的記憶體空間。
Static:
它是一個聲明靜态變量的關鍵字。靜态變量就是空間裡獨立開放的一塊靜态空間去儲存這個變量的值,如果定義了一個靜态類變量,那麼所有的執行個體都可以共享這個類變量。
class 裡的static,比如我有個類A 裡面有個static int=5,執行個體一個a,令a.這個值=10,再執行個體一個b,那麼b.這個值是多少呢?是10。因為單獨開辟了一個空間,不管多少個執行個體都是指向那裡,是以這個可以用來統計執行個體個數,也可以控制執行個體數量。比如每執行個體一個,可以讓一個靜态變量++或者–
Const:
const 修飾符:用于定義符号常量。用關鍵字 const 修飾的辨別符稱為符号常量。常量就是不能修改值的變量,而且必須有一個初始的值。
預處理程式
C++的預處理程式不是 C++編譯程式的一部分,它負責在編譯程式的其他部分之前分析處理預處理語句,為與一般的 C++語句差別,所有預處理語句都以位于行首的符号“#”開始,作用是把所有出現的、被定義的名字全部替換成對應的“字元序列”。
預處理語句有三種:宏定義、檔案包含(也成嵌入指令)和條件編譯
檔案包含是指一個程式把另一個指定檔案的内容包含進來,書寫時可以使用引号也可以使用尖括号,前者引用自己定義的包含檔案,如:#include “E:\prog\myfile.h” ,後者引用系統提供的包含檔案,如标準輸入輸出是定義,在标準庫 iostream 中的,引用時要包括以下兩條語句:
#include //包含頭檔案
using namespace std; //使用命名空間
面向過程和面向對象的差別:
面向過程主要依賴于三大結構:順序結構、選擇結構、循環結構,世界上所有的程式都可以用面向過程去實作。
面向對象就是在面向過程的基礎上加入了類和對象的概念。面向對象更适合人類的思想,更适合于程式設計。
認識 C++面向過程編譯的特點
++一、使用函數重載++
函數重載:C++允許為同一個函數定義幾個版本,進而使一個函數名具有多種功能,
這稱為函數重載。
假設有一個函數 max,分别具有以下函數原型:
int max(int,int); //2 個整型參數的函數原型
int max(int,int,int);//3個整型參數的函數原型
隻要分别為不同參數的max編制相應的函數體,就可以實作各自的功能。
++二、新的基本資料類型及其注意事項++
1、void 是無類型辨別符,隻能聲明函數的傳回值類型,不能聲明變量。
2、C++還比 C 多了 bool(布爾)型。
3、位址運算符“&”用來取對象存儲的首位址,對于數組,則數組名就是數組的
首位址。
如:int x=56;定義 x,VC++6.0 使用 4 個位元組存儲對象 56,假設存放的内
存首位址用十六進制表示為 006AFDEC,則語句 cout <<&x;自動使用十六進制輸
出存儲的首位址 006AFDEC。
4、C++與 C 一樣,也使用轉義序列。如:’\0’表示 ASCII 碼值為零的空字元
(NULL),’\101’表示字元 A。
++三、動态配置設定記憶體++
1、在使用指針時,如果不使用對象位址初始化指針,可以自己給它配置設定位址。
對于隻存儲一個基本類型資料的指針,申請方式如下:
new 類型名[size]//申請可以存儲size個該資料類型的對象
不再使用時,必須使用delete指針名;來釋放已經申請的存儲空間。
如:
……
double *p; //聲明 double 型指針
p=new double[3] //配置設定3個double型資料的存儲空間
……
delete p; //釋放已申請的存儲空間
……
2、C 必須在可執行語句之前集中聲明變量,而 C++可以在使用對象時再聲明或
定義。
++四、引用++
1、引用:就是為現有的對象起個别名,别名的位址與引用對象的位址是一樣的。所謂“引用”,就是将一個新辨別符和一塊已經存在的存儲區域相關聯。是以,使用引用時沒有配置設定新的存儲區域,它本身不是新的資料類型。可以通過修改引用來修改原對象,但是不能有空引用,在程式中必須確定引用是和一塊正确的存儲區域關聯。
引用的聲明方式為: 資料類型 & 别名=對象名; 注意對象在引用前必須先初始化,另外聲明中符号“&”的位置無關緊要,比如 int& a=x; 、int &
a=x; 和 int &a=x; 等效。
例:
……
int x=56; //定義并初始化 x
int & a=x; //聲明 a 是 x 的引用,二者位址相同
int &r=a; //聲明 r 是 a 的引用,二者位址相同
……
r=25; //改變 r,則 a 和 x 都同步變化
……
面向過程的優點和缺點:
缺點:代碼的複用性(寫過一遍再寫一遍)極差,編寫難度大。
好處:運作速度快。
面向對象的好處和缺點:
缺點:占用資源會變多,計算量大。
好處:複用性高。
運算符重載中 加号在前面和後面的差別?
Cpp編輯器可以通過在運算符函數參數表中是否插入關鍵字int來區分這兩種方式
聲明:
X operator++();//字首方式
X operator++(int);//字尾方式
調用時,參數int一般傳遞給值0
X ob;
++ob;
ob++;//隐式調用ob.operator++(int)
ob.operator++();
ob.operator++(0);//顯式調用ob.operator++(int),意為ob++
new和malloc的差別?
new一個對象,自動配置設定大小,并且自動調用構造函數。New可以被重載。有的時候你會看到new[],這些都能重載,比如你人為定義的datastructure,線性表什麼的。delete []隻能對數組。
malloc是系統方法需要手動配置設定記憶體,不能重載,不會自動執行構造函數
c語言中和str相關的幾個函數?
Strcmp:C/C++函數,比較兩個字元串
設這兩個字元串為str1,str2,
若str1==str2,則傳回零;
若str1<str2,則傳回負數;
若str1>str2,則傳回正數。
matlab中函數,strcmp(s1,s2)
判斷兩個字元串s1和s2是否相同,相同傳回true ,不同傳回false
Strcat:是用來連接配接兩個字元串的,原型是char *strcat(char *dest,char *src),作用是把src所指字元串添加到dest結尾處。
Strcopy:把從後面位址開始且含有NULL結束符的字元串複制到以前面開始的位址空間
指針、位址和引用的差別?
取指針是* ,位址和引用是與号
指針:指針是一個變量,隻不過這個變量存儲的是一個位址,指向記憶體的一個存儲單元。
引用跟原來的變量實質上是同一個東西,隻不過是原變量的一個别名而已,在函數傳參的時候用到。
面向過程的程式設計
- 傳統的設計方法,圍繞功能進行;
- 用一個函數實作一個功能;
- 所有的資料都是公用的;
- 一個函數可以使用任何
一組資料;
- 一組資料又能被多個函
數所使用。
面向對象的程式設計
-圍繞現實世界的實體(對象)進行設計;
-程式設計者從設計函數功能轉向:設計類與對象(如何用屬性和行為來描述一個實體);如何向實體發送消息以排程實體的行為。
- 一種以認識認識世界的方法為參考的程式設計方法,更為自然,更利于大型程式的組織和實作。
類的概念
++Def++:類是對一群具有相同屬性(特征/資料),表現相同行為的對象的描述。→抽象
++類的封裝++:将屬性(資料)和行為(操作代碼)放在一起,形成一個基本的機關,對外保留通路接口,隐藏資料。比如,pool的操作對外公開可通路,資料部分隐藏。
++類的繼承++:與客觀的世界相仿,類可以作為父親(父類/基類)派生出子類(派生類)。子類可以從父類那裡繼承東西(資料和操作)。比如,馬類可派生出白馬類和黑馬類,pool可作為父類派生出圓遊泳池類和方遊泳池類。
類的聲明
class 類名{
public:
公有資料和函數
private:
私有資料和函數
};
資料成員的聲明:
- 像聲明普通變量的方式來聲明,但不允許聲明時初始化;
- 允許是任何資料類型, 包括使用者自定義的類型(不允許是目前正在定義的類型);
- 聲明時可以用static修飾,可以用const修飾;不允許使用auto,register和extern修飾。
成員函數的聲明:
-
普通函數:非成員函數,即類外定義的函數。
大部分成員函數可像聲明普通函數的方式在類内聲明,可以使用const修飾。
-
常量成員函數:常量成員函數可以改變局部變量,全局變量或其他類對象的值,但不允許修改本類中的資料成員的值。
普通函數不可以作為常量函數(不能用const修飾)
類内會有一些特殊的成員函數聲明方式跟普通函數不同:
- 構造函數-負責對象的初始化
- 拷貝構造函數-負責對象的拷貝初始化
- 析構函數-負責對象的撤銷
類的使用
類類型是一種使用者自定義類型,程式員可以使用這個新類型在程式中聲明變量,具有類類型的變量稱為對象。
pool apool;
X x1,x2,x3;
可以使用sizeof()驗證對象所占用的空間大小。
類的通路控制
規定類的成員(資料成員和成員函數)對外部的開放程度。
public:可以讓本類内成員和其他程式代碼使用的部分放在公有通路控制内。–類的對外接口
在聲明了一個類以後,使用者主要是通過調用公用的成員函數來實作類提供的功能(例如對資料成員設定值,顯示資料成員的值,對資料進行加工等)。
private:隻允許本類内成員使用的部分放在私有通路控制内。–類的對外隐藏
protected:允許繼承體系中的類成員通路的部分放在受保護通路控制内
類與對象的關系
每一個實體都是對象。有一些對象是具有相同的結構和特性的。每個對象都屬于一個特定的類型。類是關于一組結構與行為相似的對象的共同特性的描述。
在Cpp中對象的類型稱為類(class)。類代表了某一批對象的共性和特征。即:類是對象的抽象,而對象是類的具體執行個體(instance)。
在Cpp程式中,類是面向對象程式靜态文本的概念,而對象是面向對象程式動态運作時的概念。
對象的使用(在類外使用公有成員):
通過對象名和成員運算符通路對象中的成員
apool.build();
通過指向對象的指針通路對象中的成員
pool *ptr=&apool;
ptr->build();
(*ptr).build();
★類内的隐含對象指針this:
所有在類内使用類成員的行為都是通過this進行。
this可以省略。
如何設計類?
Eg:停車場收費:有一個停車場,需要替管理者設計一個程式來解決停車收費的問題。
1小時内免費;
1小時以上:
超過15分鐘不到30分鐘按半小時收費;
超過30分鐘不到1小時按1小時收費;
超過1小時按每小時4元收費;
從應用的需求出發,面向對象的分析:
停車場: 位置,大小(可以停幾輛車),收費标準,幾個管理者……
管理者: 性别,年齡,籍貫,身高,體重,受教育程度,……
汽車: 品牌,顔色,輪子個數,……
時鐘/時間: 品牌,是否正常工作,時,分,秒,……
++對一個為管理者設計的收費系統,哪個對象是需要關注的?++
時間+收費标準
++如何設計時鐘類?++
·要如何使用時鐘?
有車進入停車場的時候看一下時鐘登記;
有車離開停車場的時候看一下時鐘登記;
→計算停車時間,結合收費标準收費。
·時鐘是什麼樣的?→模拟數字時鐘
有:時,分,秒 (hh:mm:ss)
可以:顯示時間
設定時間→調整時間(調整時,調整分,調整秒)
類的執行個體(考慮下列類的定義)
1.循環計數器類
- date類
3.平面幾何的位置類position
4.複數類