C++相對C的進化

tony_xj發表於2020-12-10

C++完全相容C,並對C做了增強。

型別增強

  • 型別檢查更加嚴格
int main()
{
    const int a=10;
//把const型別指標賦值給非const型別指標,在C中是可以的,在C++中是不可以的。
//    int *p=&a;
    const int *pb=&a;
    return 0;
}
  • 增加布林型別
int main()
{
    //C中使用0和非0來表示,C++中增加了具體的布林型別
    bool flag=true;
    if(!flag)
    {
        cout<<"flag is false"<<endl;
    }
    else
    {
        cout<<"flag is true"<<endl;
    }
    return 0;
}
  • 真正的列舉
enum Season
{
    spring=10, summer, autumn, winter
};


int main()
{
//定義列舉物件,無需使用enum,C需要使用enum Season s;來進行定義。
    Season s;
    s=summer;
    cout<<"s= "<<s<<endl;
//C中的列舉本質就是整型,可以賦值任何整型值;C++中只能使用列舉的元素
//    s=100;

    return 0;
}

列舉的另一個作用:可以代替巨集,C++中儘量不使用巨集。

表示式可以賦值

int main()
{
    int a=10;
    int b=20;
    //C++中表示式可以賦值,C中不可以
    (a=b)=100;
    cout<<"a= "<<a<<", b= "<<b<<endl;
    //a=100, b=20
}

輸入和輸出

cin和cout是C++中標準的輸入流和輸出流,是類物件。

  • cin:標準輸入
  • cout:標準輸出
  • cerr:標準錯誤輸出
  • clog:cerr快取輸出
int main()
{
    char name[10];
//C的方式,舊版本的會出現超過長度的異常,新版本修復了
//C設計是開放的,需要自己去處理異常
//    scanf("%s", name);
//C使用這個方式處理異常
    fgets(name, 10, stdin);
//使用string,不用考慮溢位的問題

    cout<<"name= "<<name<<endl;

    return 0;
}

格式化

c中printf提供了強大的格式化工具,cout也同樣可以,但略複雜。

int main()
{
    //取消無用程式碼
#if 0
    int a=12345;
    double b=12.345678;
    cout<<"xxxxxxxxxxxxxxxxxxxxx"<<endl;
    //設定輸出內容佔位長度
    cout<<setw(8)<<a<<endl;
    cout<<setw(8)<<setfill('0')<<a<<endl;
    //設定對齊方式
    cout<<setw(8)<<setiosflags(ios::left)<<a<<endl;
    //設定表示數值有效位數
    cout<<setw(8)<<setprecision(1)<<b<<endl;
    //設定小數位數
    cout<<setw(8)<<setprecision(4)<<setiosflags(ios::fixed)<<b<<endl;
#endif

    int a=10;
    //不同進位制輸出
    cout<<hex<<a<<endl;
    cout<<oct<<a<<endl;
    cout<<dec<<a<<endl;
    //測試輸出00:00:00格式時間
    a=5;
    cout<<setfill('0')<<setw(2)<<a<<":"<<setw(2)<<a<<":"<<setw(2)<<a<<endl;

    return 0;
}

C++支援函式過載

  • 過載規則:
    • 函式名相同
    • 引數個數不同。
    • 引數型別不同。
    • 引數順序不同。
    • 返回值型別不同不構成重構。(原因:有時候我們不使用返回值,所以不能作為判斷依據
  • 匹配原則:
    • 嚴格匹配,找到就會呼叫。
    • 通過隱式轉換,進行呼叫,要防止二義性。(不要讓程式自己去做判斷)
  • 過載底層實現
    • name mangling--傾扎技術。
    • 根據引數型別來修改函式名。
    • C++才有傾軋,C中不存在。
    • C++為呼叫C中函式,需要使用 extern "C"{}
    • 支援操作符過載。

預設引數

  • 從左向右,中間不能跳躍。
  • 實參格式+預設引數個數>=形參個數。

相關文章