1. 程式人生 > >我的C++

我的C++

l C++ 中引入標頭檔案的時候, 不帶.h. 例如#include<iostream>

l C++比C 多了一個名稱空間的概念, 這個有點類似C#的導庫. 用法例如 using namespace std;

l C++ 一樣有sizeof 這個方法可以用於獲取資料型別的長度或者是變數的位元組長度

l C++ 以及C 中的列舉和java 中區別很大, 前者的列舉不需要加列舉名, 直接用, java的列舉是必須加上列舉名的, 除了在switch 中

l C++中一樣是有typedef 關鍵字用於定義自定義的型別, 給已有的資料型別取別名, java中是沒有的. C++ 中已經有bool 值了, 而且名字和C#是一樣的, 和java 不一樣, java中的布林值是boolean,

l C 和C ++ 和java 一樣也有全域性變數,  C和C++中對char 的初始值是’\0’, 而java中char 的初始值是’\u0000

l C++一樣是可以用const 或者是#define 來定義一個常量

l C 和C++ 中如果在定義區域性變數的時候加上一個static的話,那麼這個定義變數並初始化的宣告只在第一次執行的時候有效, 例如在一個方法中有這樣一句話, static int a = 10;  然後後面改變這個值, 那麼第二次再執行這個方法的時候, 這個值不會再被重新賦值為10了, 跟java 不一樣, java中區域性變數根本就不能夠使用static關鍵字修飾

l C++ 中已經有string型別了, 都是小寫的, C++ 中的string是小寫的, 但是java 中的String 是首字母大寫的.

l C++ 的continue 也是不可以指定 繼續具體哪個迴圈. C, C++ 都只能跳出當前迴圈,但是java 是可以跳出指定迴圈的, 只要加一個標記就可以了

l C ++ 函式的形式引數是可以由預設值的, 例如 int max(int a, int b=20){}. 在外部呼叫這個函式的時候, 如果有為b賦值的話只會使用賦值的值, 如果沒有的話就會使用預設值20;

l C++ 的cos 或者sin 函式這些後面傳遞的都是一般的度數, 如90度, sin(90)=1; 這點和java 是不一樣的, java中cos後面穿的是三角函式值

l C++ 中一樣可以用printf() 函式來列印地址值 , 用”%p, 用C++的cout輸出地址值的話需要強轉才可以, 把一個字串的指標強轉成void * 就可以了, strcat 是先將前面一個字串最後的結束符去掉, 然後加入後面一個字串, 在輸出sizeof() 的時候, 不會改變左邊字串的長度, 但是strlen的話, 是改變了的, 因為他會一直往下讀直到遇到’\0’.  使用strcat 方法的時候必須保證前面一個字串有足夠的空間可以容下後面一個字串, 其實也可以直接cout<<&變數. 這樣也是可以的

一個char* 的變數, 也是可以用&取地址運算子來獲取地址的

l C++ 的引用型別是這樣的, 宣告一個引用變數指向一個真正的記憶體. 引用和指標的區別是: 首先引用必須指向一塊合法的記憶體, 引用必須是在宣告的時候就指向一塊記憶體, 而指標可以在任何時候賦值, 引用初始化之後就不能再指向另一個記憶體, 但是指標是可以的

l Time() 函式是獲取時間, time(0) 返回當前時間. Ctime() 是把當前時間轉為字串, 例如轉成 星期幾, 幾號, 幾時幾分幾秒, 多少年, 幾月,

當前時間的描述可以轉為為對應的年月日時分秒之類的單個數值,使用的是localtime(time_t * time) 這個函式, 返回一個tm* 的指標變數, 通過這個指標變數可以指向tm_year, tm_month 之類的資料, 注意的是tm_year 返回的是基於1900年開始的資料, 也就是說假如2016年那麼返回的就是116. 然後月份是從0開始的

l C++ 繼承一個類的寫法是, class A :public B{} 意思就是說A 這個類繼承B 這個類, 同時把B類中的public的屬性仍然置為public, protected 的屬性置為protected.  如果是protected 繼承的話意思就是把B類中的public和protected 的屬性都置為protected的,

l C++ 支援多繼承. 這點和java 以及C# 都是不一樣的, java和C# 都只支援單繼承, 但是支援多實現

l C++ 中如果子類過載了父類的方法那麼父類的方法就失效了, 但是可以加上這樣一句話就可以使用父類的方法了, using Basecalss:: 方法名;  這句話的意思就是把父類中的同名方法的作用域擴大到子類

l C++ 中函式重寫的機制跟C# 很像 ,也是要先在要被重寫的類上寫一個virtual關鍵字, 然後在子類中重寫就好了, 如果要呼叫父類的同名方法可以寫Baseclass::方法名();  如果父類的這個函式不加virtual的話,那麼父類引用指向子類物件的時候就會呼叫父類的方法而不是子類的方法

l C++ 的運算子過載跟C# 是不一樣的, C++ 的運算子過載: 一個類A 中過載了+運算子, 這樣寫 int operator+(A a){}; 呼叫的時候就是A a, A a1, a+a1,    C#過載如下: int operator+(A a, A a1){}. 用法一樣,但是寫法是不一樣的

l C++ 中virtual關鍵字的意思就是讓編譯器在編譯的時候,按照真正的物件的型別來確定指向的方法. 動態連結, 而不要靜態地確定地連結到這個方法,C#也是這樣的, 但是java中是不需要這樣做的,直接用就可以了

l C++ 的基本資料型別也是可以用new 這個關鍵字的, 這個跟java’ 是很不一樣,. 如果是初始化一個基本資料型別的話, 那麼括號裡面的東西就是初始化的預設值.

l C++ 中的類似乎也是有預設的空參構造的

l C++ 的抽象方法實際上就是純虛擬函式, 用virtual int add(引數列表)=0; 用這種來表示純虛擬函式, 一個純虛擬函式是必須被實現的

一個帶有純虛擬函式的類就相當於是一個抽象類, 是不可以用建立物件的 . 不管是通過宣告的方式, 還是通過new的方式, 都會報錯

l C++ 中應該是沒有interface 這個關鍵字的

l C++ 中的delete也是用來回收記憶體的, 例如建立了個物件返回了一個指標, 那麼呼叫delete(指標) 就會回收這個物件, C++的解構函式就相當於是java中的finalize 函式, 都是在回收物件. 用free 釋放記憶體的話是不會呼叫物件的解構函式的, 但是用delete 的話是會呼叫解構函式的,delete 一般和new 成對使用, new 用於建立物件, delete 用於刪除物件, free一般是和malloc 或者是calloc成對使用, 是用於釋放記憶體的.

一個物件在退出作用域之前是肯定要銷燬物件的, 不然的話在其他地方就無法回收了. 然後銷燬的時候呼叫delete 回收物件, 呼叫解構函式

l C++中巢狀的名稱空間可以通過using namespace outer::inner 這樣來指示

l C++ 中的string 可以直接當成字元陣列來用

l C++ 是不檢查資料越界的, 即使越界也不會報錯

l Cout.put(); 這個是輸出一個字元, 傳一個數字進去就會輸出對應的字元

l Wchar_t 是寬字符集, 佔兩個位元組.

l C++ 中的布林值可以提升為int值. 其中false 等於0, true 等於1.

l C++ 中可以使用3.4e2 表示340, e2 代表10的平方

l C++中在給陣列賦值的時候可以只賦一個空的大括號, 這個表示將這些陣列內部的所有元素初始化為0;

用字串常量給字元陣列賦值的時候. 要保證字元陣列的長度至少比字串的長度多一, 否則編譯都會報錯

l C++ 中的結構體也是可以用new 的, 只不過沒有建構函式而已, 應該說一切都是可以用new 的, 用new 只是表示這段記憶體是在堆中申請的而已

l C++ 中在讀文字的時候好像如果中間有滑鼠分隔符也會報錯用fin>> 的時候

l C++ 中的字串結束符\0 實際上就等於ascall碼錶中的值為0的字元. 所以也可以用作bool判斷,. 值等於false

l Ifstream>> 在讀文字的時候, 如果要讀連續的3個數字, 那麼要加個空格, 試了一下, 加逗號不行, 不加的話, 就會把整個當成一個數字

l C++ 中的陣列名實際上就是當前陣列的首元素的地址值, 但是陣列名和指標的區別是, 首先指標是可以改變的, 可以改成指向別的記憶體, 但是陣列名是不可以改變的, 還有就是對陣列名用sizeof得到的是整個陣列的位元組大小,但是對指標用sizeof的時候, 得到的是指標的長度

對陣列名取地址的話, 得到的地址是和陣列名一樣, 都是這塊記憶體中第一個元素的首地址, 但是如果進行加減運算的時候就不一樣了, 對於陣列名來說, +1 意味著地址移到到下一個元素, 但是對陣列名取地址值然後加1 的話就是移動到整個陣列的末尾的後一個地址了, 寫法是例如 int(*pas)[len]=&b, 其中b是一個int的陣列, 長度是len;

一個指標即使指向的不是一個數組也是可以用陣列表示法來修改值, 很好理解, int *p; p[i] 的意思就是在p的地址的基礎上移動i個int單位地址.

l Char *指向的字串是不可以修改的, 可以修改char * 這個指標讓他指向別的字串, 但是不可以修改原來的字串的字元. Char 陣列可以.

l Strncpy(char*, const char *, int maxsize); 最多複製多少個位元組給目標字串, 如果到達最大位元組還沒把字串複製完的話, 不會新增\0.需自己新增. 這一點和cin.getLine(str, int maxsize) 有點不太一樣, 後面這個是如果還沒遇到enter鍵的話, 會最多隻讀maxsize-1 個字元, 然後加上一個\0字元結尾

l New 和delete可以在不同的函式中, 只要指向的地址值是同一塊就好了, 但是這樣的話, 就是怕會忘掉.

陣列的體代表vector和array, vector是建立在堆中, array是在棧中.

l C++ 開始引入了bool, 其中在轉換為數值的時候, false為0. True 為1. 在需要bool值的時候,. 會把0轉為false, 其他轉為true

l 用fstream讀取 文字的時候,. 不論是開啟失敗, 還是已經讀到檔案末尾都可以用!Fstream來做判斷, 當開啟失敗或者是讀到檔案末尾的時候fstream都會被轉為false.

在建立單鏈表的時候, 最好是從末端開始一個個往上建立.

一個指標在建立的時候最好賦值.不然的話會報錯的,. 不然的話, 不知道指向哪一塊記憶體,  最好是建立的時候就讓他指向NULL

l C++中的extern的作用也就是說這個變數或者函式是在其他的cpp檔案中定義的, 我這裡只是用來引用而已.然後這個變數無論是在哪個檔案中被修改都是生效的, 另一個檔案在引用的時候也是用的新的值了

l String 的賦值並不是傳遞地址值, 例如, string a=”henry”. String str1= a; 如果是地址傳遞的話,那麼改變a裡面的字元, str1也是會改變的, 但是事實是這並不會. 應該說, string都不是一個地址值,. 是一個模板類的物件,  媽的很明顯啊, 如果是地址值的話,那麼他在呼叫方法的時候就應該是->了

l C++ 中的vector已經可以起到和list一樣的效果了. 新增元素是push_back, 建立的時候也是要輸入泛型的.  然後可以先不用確定長度,獲取位於某個下標的元素是at方法,  用size()方法獲取到這個陣列內部的元素的總數,

l Ifstream.open 在開啟一個檔案的時候如果成功了,那麼呼叫is_open方法返回true否則返回false, 所以這個函式可以很好地用來判斷開啟檔案的結果, 或者也可以用good這個方法來做這個判斷

l Java 中可以轉換int 的數在執行操作的時候都會提升為int, 但是C++ 不會, 例如: char c=’1’, char ch=c+1; 輸出ch等於2, 這裡並不報錯,

l 對一個變數的引用就是相當於使用這個變數, 這樣理解就好了, 也就是說本來一個變數在初始化之後, 別的變數不可以再次使用這個地址值, 但是用引用的話也就是說這個變數存的地址跟那一個是一樣的, 所以說兩個變數的地址值是一樣的, 所以說用變數和變數的引用是一樣的效果

l C++ 中string+在呼叫的時候如果後面是一個int數, 那麼他會把這個int數轉成字元然後新增. 所以如果一個string str=””的話, 那麼他在+1 的時候不會變成”1”而會變成奇怪的字串

l 不知道為什麼有時候在傳參的時候接受double的形式引數竟然不能直接接受一個int數, 還他媽要強轉;