C++學習記錄(二)

C++對C的優化

有關優化的部分,咱們對比一下兩組代碼分別是 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*)

有關struct(漸漸引出面向對象OOP)

//.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

關於const

//.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不分配內存並非絕對的,有如下幾種狀況會分配內存:設計

  • 用extern來擴大做用域時,會分配內存。
  • 用普通變量初始化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 MAXcode

儘可能以const,enum,inline替換 #define
用編譯器替換預處理器。

更詳細請參考《Effective C++ 改善程序設計的55個具體作法》對象

相關文章
相關標籤/搜索