1.extern "C"的作用
因為C語言和 C++ 語言的編譯規則不一樣,所以要告訴系統哪些函數是用 C 方式編譯,哪些函數需要用 C++ 方式編譯。
如果你不加 extern "C" ,在編譯時,系統會提示找不到此函數。
extern "C"表示編譯生成的內部符號名使用C約定
例如:
int Fun(int i,int j)
C:_Fun
C++:_Fun_int_int
具體生成什么可能與編譯器有關
由于C++支持重載,而重載是在編譯期確定的,所以C++必須在內部符號名上區分各重載函數,所以就將參數類型加在函數名后。
2. C++引用與指針的比較
下面程序中,n是m的一個引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n相當于m的別名(綽號),對n的任何操作就是對m的操作。
所以n既不是m的拷貝,也不是指向m的指針,其實n就是m它自己。
引用的規則:
(1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。
(2)不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)。
(3)一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象)。
以下示例程序中,k被初始化為i的引用。
語句k = j并不能將k修改成為j的引用,只是把k的值改變成為6。
由于k是i的引用,所以i的值也變成了6。
int i = 5;
int j = 6;
int &k = i;
k = j; // k和i的值都變成了6;
3. struct和class的區別
1)C++中的struct只是為了和C兼容而做的一個默認為public的class。
2)struct默認訪問權限為pulbic; class默認訪問權限為private
3)在繼承下 struct默認pulbic繼承; class默認訪問private繼承;
C++中 ,結構和類只是其默認權限不同,除此之外沒有差別。
4.堆和棧的區別
一個由c/C++編譯的程序占用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。 - 程序結束后有系統釋放
4、文字常量區 —常量字符串就是放在這里的。 程序結束后由系統釋放
5、程序代碼區—存放函數體的二進制代碼。
二、例子程序
這是一個前輩寫的,非常詳細
//main.cpp
int a = 0; 全局初始化區
char *p1; 全局未初始化區
main()
{
int b; 棧
char s[] = "abc"; 棧
char *p2; 棧
char *p3 = "123456"; 123456\0在常量區,p3在棧上。
static int c =0; 全局(靜態)初始化區
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來得10和20字節的區域就在堆區。
strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。
5.Debug 和 Release 編譯方式的本質區別
Debug 通常稱為調試版本,它包含調試信息,并且不作任何優化,便于程序員調試程序。
Release 稱為發布版本,它往往是進行了各種優化,使得程序在代碼大小和運行速度上都是最優的,以便用戶很好地使用。
6.sizeof用法總結
A. 參數為數據類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int類型在16位系統中占2個字節,在32位系統中占4個字節。
B. 參數為數組或指針。下面舉例說明.
int a[50]; //sizeof(a)=4*50=200; 求數組所占的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針
//的大小,在32位系統中,當然是占4個字節。
C. 參數為結構或類。Sizeof應用在類和結構的處理情況是相同的。但有兩點需要注意,第一、結構或者類中的靜態成員不對結構或者類的大小產生影響,因為靜態變量的存儲位置與結構或者類的實例地址無關。 第二、沒有成員變量的結構或類的大小為1,因為必須保證結構或類的每一 個實例在內存中都有唯一的地址。
下面舉例說明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個指針。
Class test1{ };//sizeof(test1)=1;
D. 參數為其他。下面舉例說明。
int func(char s[5]);
{
//數的參數在傳遞的時候系統處理為一個指針,所
//以sizeof(s)實際上為求指針的大小。
}
sizeof(func(“1234”))=4//因為func的返回類型為int,所以相當于
//求sizeof(int).