c++對C語言的擴展(一)

(一) C++對C的加強:
1)命名空間:
爲什麼要引入命名空間這個概念:一箇中大型軟件往往由多名程序員共同開發,會使用大量的變量和函數,不可避免地會出現變量或函數的命名衝突。當所有人的代碼都測試通過,沒有問題時,將它們結合到一起就有可能會出現命名衝突。
 
例如小李和小韓都參與了一個文件管理系統的開發,它們都定義了一個全局變量 fp,用來指明當前打開的文件,將他們的代碼整合在一起編譯時,很明顯編譯器會提示 fp 重複定義(Redefinition)錯誤。
 
爲了解決合作開發時的命名衝突問題,C++ 引入了命名空間(Namespace)的概念。
命名空間將全局作用域分成不同的部分
不同命名空間中的標識符可以同名而不會發生衝突
命名空間可以相互嵌套
全局作用域也叫默認命名空間
怎樣使用命名空間:
1°命名空間的定義:
 /**
namespace 是C++中的關鍵字,用來定義一個命名空間,語法格式爲:
namespace name
{
    變量
    函數
    類
}
name是命名空間的名字,它裏面可以包含變量、函數、類、typedef、#define 等,最後由{ }包圍 
**/
// 定義一個命名空間,名字叫NameSpaceA
namespace NameSpaceA
{
    int a = 0;
}
 
// 命名空間的定義可以嵌套
namespace NameSpaceB
{
    int a = 1;
 
    namespace NameSpaceC
    {
        struct Teacher
        {
            char name[10];
            int age;
        };
    }
}
2°命名空間的使用:
1°使用域解析符(::):// ::是一個新符號,稱爲域解析操作符,在C++中用來指明要使用的命名空間。
NameSpaceA::a = 10;   // 使用命名空間 NameSpaceA中的變量a
NameSpaceB::a = 20;   // 使用命名空間 NameSpaceB中的變量a
printf ("%d, %d\n", NameSpaceA::a, NameSpaceB::a);
 
使用命名空間B中的命名空間C中的結構體 Teacher
NameSpaceB::NameSpaceC::Teacher t2 = {"xiaoming", 20};


3°使用using聲明:在這裏用using聲明瞭 NameSpaceA::a, 它的意思是在聲明以後的程序中如果出現
未指明命名空間的a,就使用NameSpaceA命名空間裏的a
如果要使用NameSpaceB命名空間中的a,則仍需要使用這樣的方式 NameSpaceB::a;
using NameSpaceA::a;
a = 20;                // 使用命名空間NameSpaceA中的a
NameSpaceB::a = 30;    // 使用命名空間NameSpaceB中的a
using 聲明不僅可以針對命名空間中的變量或者函數,還可以對整個命名空間進行聲明
這樣的方式聲明命名空間以後,在後面使用未指定具體命名空間的變量或者函數產生命名衝突的時候
默認使用 NameSpaceB中的變量和函數
using namespace NameSpaceB;
a = 10;
printf ("%d\n", NameSpaceB::a);


4°c++標準庫和std命名空間: C++ 引入了命名空間的概念,計劃重新編寫庫,將類、函數、宏等都統一納入一個命名空間,這個命名空間的名字就是std。std 是 standard 的縮寫,意思是“標準命名空間”,可以發現,對於不帶.h的頭文件,所有的符號都位於命名空間 std 中,使用時需要聲明命名空間 std;對於帶.h的頭文件,沒有使用任何命名空間,所有符號都位於全局作用域。這也是 C++ 標準所規定的。


2)實用性增強:C語言中的變量都必須在作用域開始的位置定義!!
      C++中更強調語言的“實用性”,所有的變量都可以在需要使用時再定義。


3)register關鍵字的變化:register關鍵字請求“編譯器”將局部變量存儲於寄存器中 C語言中無法取得register變量地址
  
在C++中依然支持register關鍵字:
    1、C++編譯器有自己的優化方式,不使用register也可能做優化
    2、C++中可以取得register變量的地址
C++編譯器發現程序中需要取register變量的地址時,register對變量的聲明變得無效。


4)變量檢測加強:
    1、在C語言中重複定義多個全局變量是合法的 這些同名的全局變量最終都會被鏈接全局數據區的同一個地址空間上
    2、在C++中不允許定義多個同名的全局變量


5)struct的加強:  
   1、C語言中 struct 定義了一組數據的集合,而不是一種新的數據類型 所以在定義變量的時候需要在前面加上 struct 關鍵字進行修飾
   2、 C++中 struct 定義了一種新的數據類型,可以直接用來定義變量


6)C++中所有變量和函數都必須要有類型:
   1、在C語言中
      int f(    );表示返回值爲int,接受任意參數的函數
      int f(void);表示返回值爲int的無參函數
 
   2、在C++中
      int f(  );和int f(void)具有相同的意義,都表示返回值爲int的無參函數
 
C++更加強調類型,任意的程序元素都必須顯示指明類型


7)新增bool類型關鍵字: 
    1、  bool類型只有true(非0)和false(0)兩個值
    2、 C++編譯器會在賦值時將非0值轉換爲true,0值轉換爲false


8)三目運算符的增強:
   1、C語言返回變量的值 C++語言是返回變量本身
    C語言中的三目運算符返回的是變量值,不能作爲左值使用
    C++中的三目運算符可直接返回變量本身,因此可以出現在程序的任何地方
 
   2、注意:三目運算符可能返回的值中如果有一個是常量值,則不能作爲左值使用
    (a < b ? 1 : b )= 30;

發佈了75 篇原創文章 · 獲贊 45 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章