c++基礎學習疑難點
^ 與 ~區別
void*作用,返回任意型別的指標
條件編譯如下:
#ifdef 識別符號 程式段1 #else 程式段2 #endif
sizeof(a):返回變數的大小
,:逗號運算子會順序執行一系列運算。整個逗號表示式的值是以逗號分隔的列表中的最後一個表示式的值。
.或者->:成員運算子用於引用類、結構和共用體的成員
強制轉換運算子把一種資料型別轉換為另一種資料型別。例如,int(2.2000) 將返回 2。
&:指標運算子 & 返回變數的地址。例如 &a; 將給出變數的實際地址。
*:指標運算子 * 指向一個變數。例如,*var; 將指向變數 var。
函式宣告:
int max(int num1, int num2);
傳值呼叫 | 該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。 |
指標呼叫 | 該方法把引數的地址複製給形式引數。在函式內,該地址用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。 |
引用呼叫 | 該方法把引數的引用複製給形式引數。在函式內,該引用用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。 |
Lambda 函式與表示式:
[](int x, int y){ return x < y ; }
引用很容易與指標混淆,它們之間有三個主要的不同:
- 不存在空引用。引用必須連線到一塊合法的記憶體。
- 一旦引用被初始化為一個物件,就不能被指向到另一個物件。指標可以在任何時候指向到另一個物件。
- 引用必須在建立時被初始化。指標可以在任何時間被初始化。
(1)將變數名作為實參和形參。這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實參不是同一個儲存單元。// 同 c
(2) 傳遞變數的指標。形參是指標變數,實參是一個變數的地址,呼叫函式時,形參(指標變數)指向實參變數單元。這種通過形參指標可以改變實參的值。// 同 c
(3) C++提供了 傳遞變數的引用。形參是引用變數,和實參是一個變數,呼叫函式時,形參(引用變數)指向實參變數單元。這種通過形參引用可以改變實參的值
(1)以引用返回函式值,定義函式時需要在函式名前加 &
(2)用引用返回一個函式值的最大好處是,在記憶體中不產生被返回值的副本。
引用作為返回值,必須遵守以下規則:
- (1)不能返回區域性變數的引用。主要原因是區域性變數會在函式返回後被銷燬,因此被返回的引用就成為了"無所指"的引用,程式會進入未知狀態。
- (2)不能返回函式內部new分配的記憶體的引用。雖然不存在區域性變數的被動銷燬問題,可對於這種情況(返回函式內部new分配記憶體的引用),又面臨其它尷尬局面。例如,被函式返回的引用只是作為一 個臨時變量出現,而沒有被賦予一個實際的變數,那麼這個引用所指向的空間(由new分配)就無法釋放,造成memory leak。
- (3)可以返回類成員的引用,但最好是const。主要原因是當物件的屬性是與某種業務規則(business rule)相關聯的時候,其賦值常常與某些其它屬性或者物件的狀態有關,因此有必要將賦值操作封裝在一個業務規則當中。如果其它物件可以獲得該屬性的非常 量引用(或指標),那麼對該屬性的單純賦值就會破壞業務規則的完整性。
typedef 關鍵字
下面是一種更簡單的定義結構的方式,您可以為建立的型別取一個"別名"。例如:
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
當一個類派生自基類,該基類可以被繼承為 public、protected 或 private 幾種型別。繼承型別是通過上面講解的訪問修飾符 access-specifier 來指定的。
我們幾乎不使用 protected 或 private 繼承,通常使用 public 繼承。當使用不同型別的繼承時,遵循以下幾個規則:
- 公有繼承(public):當一個類派生自公有基類時,基類的公有成員也是派生類的公有成員,基類的保護成員也是派生類的保護成員,基類的私有成員不能直接被派生類訪問,但是可以通過呼叫基類的公有和保護成員來訪問。
- 保護繼承(protected): 當一個類派生自保護基類時,基類的公有和保護成員將成為派生類的保護成員。
- 私有繼承(private):當一個類派生自私有基類時,基類的公有和保護成員將成為派生類的私有成員。
虛繼承:多個派生類儲存相同基類的同名成員時,雖可以在不同的資料成員中分別存放不同的資料 ,但我們只需要相同的一份。
解決了多父類重複成員只保留一份的問題。
結構體或者指標使用-> 當訪問直接物件的成員或資料時,用“.”
虛擬函式 是在基類中使用關鍵字 virtual 宣告的函式。在派生類中重新定義基類中定義的虛擬函式時,會告訴編譯器不要靜態連結到該函式。
我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態連結,或後期繫結。
您可能想要在基類中定義虛擬函式,以便在派生類中重新定義該函式更好地適用於物件,但是您在基類中又不能對虛擬函式給出有意義的實現,這個時候就會用到純虛擬函式。
我們可以把基類中的虛擬函式 area() 改寫如下:
class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } // pure virtual function virtual int area() = 0; };
= 0 告訴編譯器,函式沒有主體,上面的虛擬函式是純虛擬函式。
const在在函式前與加在函式後區別;const加在前面表示範圍的物件或者指標所指向的物件不可改變;加在後面表示不可改變成員變數資料,並且函式裡面不可呼叫非const成員函式;
class與struct區別;如果定義更像是資料結構就用struct;如果更像是一個物件就用class;區別主要是在繼承時候的訪問許可權;預設情況下 子struct預設public繼承父struct;而子class預設private繼承父class;
new與malloc()
using std::cout;
巢狀名稱空間使用:using namespace namespace_name1::namespace_name2;
行內函數 inline
函式模板與類模板
前處理器
條件編譯:有幾個指令可以用來有選擇地對部分程式原始碼進行編譯。這個過程被稱為條件編譯。
未完待續。。。