你所不知道的C++

C++與C的不一樣

    C++從誕生之初就號稱和C是兼容的,正是這種兼容,使C++得以迅猛發展,然而也正是這種兼容,讓C++背上了沉重的歷史包袱。且不論其利弊,讓咱們來看看C++在兼容C的那部分中,與C語言有什麼不一樣。html

1. bool

    在C語言中,沒有bool類型,咱們一般的作法是:數組

   1:  #ifndef FALSE
   2:  #define FALSE 0
   3:  #endif
   4:   
   5:  #ifndef TRUE
   6:  #define TRUE (!(FALSE))
   7:  #endif

而在C++中,事情簡單了不少,bool是內置類型,true和false也是C++的關鍵字,咱們能夠直接使用。函數

2. 類型轉換

    C語言容許void *類型隱式轉換爲其餘類型指針,而C++不容許。好比咱們使用malloc申請內存,在C和C++中的寫法是不同的:spa

   1:  // C
   2:  char *a = malloc(10);
   3:   
   4:  // C++
   5:  char *a = (char*)malloc(10);

固然,將其餘指針類型轉換爲void *在兩種語言中都是能夠的,由於它是「向上類型轉換」。指針

3. 字符常量的大小

    在C和C++中,char類型都是佔用1個字節。可是字符常量在兩種語言中大小倒是不同的,在C中,字符常量與int類型同樣,32位機器上佔用爲4個字節,而C++中,字符常量與char類型同樣,佔用爲1個字節。code

   1:  // C, output:1 4
   2:  char a = 'a';
   3:  printf("%d %d\n", sizeof(a), sizeof('a'));
   4:   
   5:  // C++, output:1 1
   6:  char a = 'a';
   7:  cout<<sizeof(a)<<" "<<sizeof('a')<<endl;
4. const變量

    const變量在C語言中聲明時能夠不初始化,它的值根據做用域而定(若是是全局變量或static變量,初始化爲0,不然爲垃圾值),而在C++中聲明時必須被初始化,且默認僅本文件內可見。在C中,const變量不能用於數組的聲明(C99中引入的可變數組除外),而在C++中,const變量能夠用在數組聲明中標明數組大小。htm

5. 函數的聲明

    一樣的函數聲明void f();在C中,調用該函數時,能夠傳入任意個數的參數,可是在函數中沒法正常取到傳入參數的值。而在C++中,這樣的函數聲明就是說:我不接受任何參數。內存

   1:  // C, output: hello
   2:  void f()
   3:  {
   4:      printf("hello\n");    
   5:  }
   6:   
   7:  int main(int argc, char *argv[])
   8:  {
   9:      f(1, 2, 3, 4);
  10:   
  11:      return 0;
  12:  }
  13:   
  14:  // C++, compile error: too many arguments to function 'void f()'
  15:  void f()
  16:  {
  17:      cout<<"hello"<<endl;    
  18:  }
  19:   
  20:  int main(int argc, char *argv[])
  21:  {
  22:      f(1, 2, 3, 4);
  23:      
  24:      return 0;
  25:  }

如何在C語言中聲明不接受任何參數的函數呢?答案是:作用域

   1:  // C, function f accept no arguments
   2:  void f(void)
   3:  {
   4:      printf("hello\n");    
   5:  }

 此外,在C語言中,在調用函數的時候不必定須要函數已經聲明,找不到合式的函數聲明時,編譯器會默認生成一個返回類型爲int的函數聲明,只有在連接時若是找不到函數實現纔會報錯;而在C++中,調用函數時要求該函數必須已經聲明,不然在編譯階段就會產生錯誤。rem

6. 結構體

    在C語言中,聲明結構體變量時必須有struct關鍵字,而在C++中,struct和class是同樣的,僅用結構體名稱就能夠聲明變量。

    此外,空結構體的大小在C和C++也也有差別,C語言中爲0,而C++中爲1。

   1:  // C, output:0 0
   2:  struct str_empty {
   3:      
   4:  };
   5:  int main(int argc, char *argv[])
   6:  {
   7:      struct str_empty s;
   8:      printf("%d %d\n", sizeof(struct str_empty), sizeof(s));
   9:   
  10:      return 0;
  11:  }
  12:   
  13:  // C++, output: 1 1
  14:  struct str_empty {
  15:      
  16:  };
  17:  int main(int argc, char *argv[])
  18:  {
  19:      str_empty s;
  20:      cout<<sizeof(str_empty)<<" "<<sizeof(s)<<endl;
  21:      
  22:      return 0;
  23:  }
7. 函數默認參數

    在C和Java中,都沒有函數默認參數,而在C++和Python中,均可以提供默認參數。

 

你所不知道的C++

    C++一直以來就是一個龐然大物,而隨着它的發展,又不斷被加入新的東西,如今的C++的複雜程度實在是讓人望而生畏。這裏且看看C++中有哪些比較有用而又不多被人說起的功能。

1. explict
2. function-try-block
3. 重載類型轉換操做符
4. 指向成員的指針
相關文章
相關標籤/搜索