有關優化的部分,咱們對比一下兩組代碼分別是 C語言和C++的寫法。c++
//.C----------- int a; int a = 10;//能夠編譯 //.cpp---------- int a; int a = 10;//報錯,重複編譯
//.c------------------- int a(b,c) {} void test() { a(0,100,10);//仍然能夠經過編譯 } //.cpp------------------- int a(b,c) {} //沒有~~~~參數類型和沒有返回值 void test() { a(0,100,10);//報錯! //參數個數不匹配 }
//.c------------------ char * p = malloc(sizeof(64));//malloc返回void*類型,進行轉換。能夠編譯 //.cpp---------------- char * p = malloc(sizeof(64));//沒法編譯。char*不等於void*。須要手動強制類型轉換(char*)
//.c-------------------- struct A { int a; char c; }; void test() { struct A a;//須要加struct } //.cpp------------------- struct A { int a; char c; }; void test() { struct A a;//能夠步加struct //同時C++的結構體中能夠有函數 }
在這裏能夠引入有關面向對象的一些思想。(若是以前學過Java,會更好理解一下的描述)
C語言中結構體中不能放函數。而函數(function)其實就是實現某一種功能。
C++中結構體中能夠放入函數。其實能夠這樣理解:一個事物(不管是什麼東西,吃的喝的用的,活的死的等等)都有本身的參數或者本身的方法(二者至少有其一)咱們能夠在許許多多的事物中的找到他們的共同點(或許是共同的參數,或者是相似的功能).把這些相同點,都放入C++的結構體中,這就是一個"類"。這裏C++就引入面向對象的思想。
[注]:C語言之因此不是面向過程,這正是由於C語言把參數和功能分開存放。(這裏涉及到面向對象的一個特性--封裝)用OOP的話來講,就是沒有把成員變量(Java:屬性)和成員函數(Java:方法)封裝到一塊兒。因此C++中結構體實際上是特殊的類。數組
//.c---------------------------------- int a = 1; int b = 2; printf("結果:" ,a > b ? a : b );//輸出結果是2 a > b ? a : b = 3;//此時編譯器就會報錯,由於這一條語句至關與 2 = 3 //若是咱們但願上述語句能成立,咱們應該這樣改寫: *(a > b ? &a : &b) = 3; //但此時,奇怪的事情發生了。當咱們用printf輸出a,b的時候發現b的值被改變了。 //.cpp---------------------------------- int a = 10; int b = 20; cout << "結果是: "<< (a > b ? a : b) << endl;//能夠編譯,結果是20 (a > b ? a : b) = 100;//能夠經過,c++ 中返回的是變量 cout<<"a = "<<a<<endl;//a = 10 cout<<"b = "<<b<<endl;//b = 100
//.c------------------------------------ const int m = 10;//沒法修改 void test() { const int n = 20; int * p = (int *)&n; *p = 200; printf("*p = %d n = %d",*p,n); //*p = 200 n = 200 //咱們已經把n修改了。這實際上應該是不被容許的,不給const面子。 } //.cpp---------------------------------- const int n = 20;//不容許修改,僞常量: int arr[n]不能初始化數組! //若是要修改: int *p = (int*)&n; *p = 200; printf("*p = %d,n = %d ",*p,n); //*p = 200,n = 20 //*p 確實改了,但n沒有改
在C語言中,const int n = 2; 實際上是給n分配了空間的,只要分配了空間,咱們就能夠用&找到地址,用指針修改。
在C++中,const int n = 2;沒有分配空間,而是把n放到一個表(key-value表)裏面。用n的時候直接查表。函數
int p = (int)&n;*p = 200;這裏的修改了哪裏的地址呢?
編譯器開闢了一個臨時的空間,至關於int temp = n;int p = (int )&temp; *p指向了臨時空間。優化
可是C++ const不分配內存並非絕對的,有如下幾種狀況會分配內存:設計
int a = 10;
const int b = a;
咱們能夠用上述方法來修改內存。指針
補充:
儘可能用const代替#define#define MAX 1024;
define 是在預處理過程當中,對MAX進行了替換。換句話講,編譯器根本不認識MAX,即編譯器壓根不知道有MAX這一回事。因此MAX並無進入符號表中。若是在編譯過程當中出現了困惑,由於這個信息是會提到1024,並無提到MAX。若是MAX被定義在不是你寫的頭文件中,你可能根本不知道1024表明了什麼。(並且define既沒有類型也沒有做用域)此時,用const定義MAX。const int MAX = 1024;
並且#define必須手動卸載,否則就會一直到結束。#define MAX 1024
.....#undef MAX
code
儘可能以const,enum,inline替換 #define
用編譯器替換預處理器。
更詳細請參考《Effective C++ 改善程序設計的55個具體作法》對象