1. 程式人生 > >第2課-C到C++的升級

第2課-C到C++的升級

一、升級一

  • C++更強調語言的實用性
  • 所有的變數都可以在需要使用時再定義
int c = 0;
for(int i = 0;i <= 3;++i){
  for(int j = 1;j <= 3;++j){
    c += i * j;
  }
}

對比:C語言中的變數都必須在作用域開始的位置定義

二、升級二

register關鍵字請求編譯器將區域性變數儲存於暫存器中
(備註:對於C語言中儲存空間和變數型別不熟悉,可以看一下這篇部落格
C變數與函式型別

  • 在C++中依然支援register關鍵字
  • C++編譯器有自己的優化方式

    • C語言中無法獲取register變數的地址
    • C++中可以取得register變數的地址
  • C++中的register關鍵字

C++編譯器發現程式中需要取register變數的地址時,register對變數的宣告變得無效

早期C語言編譯器不會對程式碼進行優化,因此register變數是一個很好的補充

三、升級三

  • 在C語言中,重複定義多個同名的全域性變數是合法的
    • C語言中多個同名的全域性變數最終會被連結到全域性資料區的同一個地址空間上
  • 在C++中,不允許定義多個同名的全域性變數
    • C++直接拒絕這種二義性做法

例項分析:C到C++的升級一

#include<stdio.h>

int g_v;
//int g_v;

int main(int argc,char *argv[]){
    printf("Begin...\n");
    int c = 0;
    for(int i = 0;i <= 3;++i){
        for(int j = 1;j <= 3;++j){
            c += i * j; 
        }
    }
    printf("c = %d\n",c);
    register int a = 0
; printf("&a = %p\n",&a); printf("End...\n"); return 0; }

列印結果:

Begin...
c = 36
&a = 000000000062FE40
End...

此程式在C語言編譯器中便無法通過,原因就在於以上的“升級”。

四、升級四

  • struct關鍵字的加強
    • C語言中的struct定義了一組變數的集合
    • C語言中的struct定義的識別符號並不是一種新的型別
    • C++中的struct用於定義一個全新的型別
//C語言中結構體的定義
typedef struct _tag_student Student; //此時可以作為一種新的型別,但本質仍然是一組變數
struct _tag_student{
  const char* name;
  int age;
};

//C++中結構體定義
struct Student{
  const char* name;
  int age;
};

五、面試中的小問題-升級五

int f()int f(void) 有區別嗎?如果有區別是什麼?

  • C++中所有的識別符號都必須顯示地宣告型別
  • C語言中的預設型別在C++中是不合法的
f(i){
  printf("i = %d\n",i);
}
g(){
  return 5;
}

問題:

  1. 函式f的返回值和引數分別是什麼型別?
  2. 函式g可以接受多少個引數?

答:

  • 在C語言中
    • int f()表示返回值為int接受任意引數的函式
    • f(void)表示返回值為int無參函式 (不接受任何引數)
  • 在C++中
    • int f()int f(void)具有相同的意義
    • 表示返回值為int的無參函式

例項分析:C到C++的升級二

#include<stdio.h>

//typedef struct Student Student;
struct Student{
    const char* name;
    int age;
};

//f(i){
//  printf("i = %d\n",i);
//}
//g(){
//  return 5;
//}

int main(int argc,char *argv[]){
    Student s1 = {"1",2};
    Student s2 = {"3",4};
    //f(10);
    //printf("g() = %d\n",g(1,2,3,4,5));
    return 0;
}

務必注意註釋位置,註釋位置只能在C語言編譯器下通過。原因見上解釋
(附註:C++是一種強型別的語言,“++”可以理解為型別的加強面向物件特性的增加

六、總結

  • C++更強調實用性,可以在任意的地方宣告變數
  • C++中的register只是一個相容的作用
  • C++編譯器能夠更好地進行優化
  • C++中的任意識別符號都必須顯示地指明型別