1. 程式人生 > >C++筆記 第二課 C到C++的升級---狄泰學院

C++筆記 第二課 C到C++的升級---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux

第二課 C到C++的升級

1.C與C++的關係

C++繼承了所以的C特性 C++在C的基礎上提供了更多的語法和特性 C++的設計目標是執行效率和開發效率的統一

2.C到C++的升級

C++更強調語言的實用性,所有的變數都可以在需要使用時定義

int c = 0; 
for(int i=1; i<=3; i++) 
{ 
for(int j=1; j<=3; j++) 
{ 
c += i * j; 
} 
}

對比:C語言中的變數都必須在作用域開始的位置定義!! register關鍵字請求編譯器將區域性變數儲存於暫存器中 C++中依然支援register關鍵字 C++編譯器有自己的優化方式 C語言無法獲取register變數的地址 C++中可以取得register變數的地址 C++中的register關鍵字 C++編譯器發現程式中需要取register變數的地址時,register對變數的宣告變得無效。 早期C語言編譯器不會對程式碼進行優化,因此register變數是一個很好的補充。 在C++中,不允許定義多個同名的全域性變數,C++直接拒絕這種二義性的做法。 在C語言中,重複定義多個同名的全域性變數是合法的,C語言中多個同名的全域性變數最終會被連結到全域性資料區的同一個地址空間上。

2-1.cpp 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=1; i<=3; i++)
    {
        for(int j=1; j<=3; j++)
        {
            c += i * j;
        }
    }
    printf("c = %d\n", c);
    register int a = 0;   //register 當代C++編譯器已經直接將register刪掉
    printf("&a = %p\n", &a);
    printf("End...\n");
    return 0;
}
執行:g++ 2-1.cpp
  ./a.out
執行結果:
36
&a = 0x7fffa321ac48
End...
在.C中執行:
#include <stdio.h>
int g_v;
int g_v; //不報錯,C支援定義同名的變數
int main(int argc, char *argv[])
{
    printf("Begin...\n");
    int c = 0;
    for(int i=1; i<=3; i++)  //C不允許在for裡面進行定義變數
    {
        for(int j=1; j<=3; j++)  //C不允許在for裡面進行定義變數
        {
            c += i * j;
        }
    }
    printf("c = %d\n", c);
    register int a = 0;   
    printf("&a = %p\n", &a);  //C不允許對register取地址
    printf("End...\n");
    return 0;
}

struct關鍵字的加強 C語言中struct定義了一組變數的集合 C語言中的struct定義的識別符號並不是一種新的型別 C++中的struct用於定義一個全新的型別

C和C++中結構體的等價定義

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

思考:面試中的小問題

int f() 與int f(void)有區別嗎?如果有區別是什麼?與編譯器有關 C編譯器:有區別,int f()函式型別返回值為int,引數任意多個,int f(void)函式型別返回值為int,不接受引數 C++編譯器:無區別 C++中所有的識別符號都必須顯示的宣告型別 C語言中的預設型別在C++中是不合法的

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

問題: 1.函式f的返回值和引數分別是什麼型別? C中,未定義預設為int,返回值為int型別,引數為int型別 C++中,錯誤的 2.函式g可以接受多少個引數? C中,可以是任意多 C++中,錯誤的

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

2-2.cpp C到C++的升級二

#include <stdio.h>
struct Student
{
    const char* name;
    int age;
};
/*error
f(i)
{
    printf("i = %d\n", i);
}
g()
{
    return 5;
}
*/
int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30};
    Student s2 = {"Tang", 30};
    
    f(10);
    
    printf("g() = %d\n", g(1,2,3,4,5));
    
    return 0;
}    

在C中執行:
#include <stdio.h>
typedef struct _tag_student Student;    	 
struct _tag_student                  	 
{                                     	 
    const char* name;                   	
    int age;                           	 
};
f(i)   //int f(int i)
{
    printf("i = %d\n", i);
}
g()   //int g(int i)
{
    return 5;
}
int main(int argc, char *argv[])
{
    Student s1 = {"Delphi", 30};
    Student s2 = {"Tang", 30};
    
    f(10);
    
    printf("g() = %d\n", g(1,2,3,4,5));
    
    return 0;
}  

小結

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