日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 学习基础篇(一)—— C++与C 的区别

發布時間:2023/12/9 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 学习基础篇(一)—— C++与C 的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?? 編程的學習學無止境,只掌握一門語言是遠遠不夠的,現在我們開始C++的學習之路,下面先看下C++ 與C 的區別

一、C++概述

1、發展歷史

? ? ? 1980年,Bjarne Stroustrup博士開始著手創建一種模擬語言,能夠具有面向對象的程序設計特色。在當時,面向對象編程還是一個比較新的理念,Stroustrup博士并不是從頭開始設計新語言,而是在C語言的基礎上進行創建。這就是C++語言。

? ? ?1985年,C++開始在外面慢慢流行。經過多年的發展,C++已經有了多個版本。為次,ANSI和ISO的聯合委員會于1989年著手為C++制定標準。1994年2月,該委員會出版了第一份非正式草案,1998年正式推出了C++的國際標準。

2、C和C++

? ? ? C++是C的超集,也可以說C是C++的子集,因為C先出現。按常理說,C++編譯器能夠編譯任何C程序,但是C和C++還是有一些小差別。

? ? ? 例如C++增加了C不具有的關鍵字。這些關鍵字能作為函數和變量的標識符在C程序中使用,盡管C++包含了所有的C,但顯然沒有任何C++編譯器能編譯這樣的C程序。

? ???C程序員可以省略函數原型,而C++不可以,一個不帶參數的C函數原型必須把void寫出來。而C++可以使用空參數列表

? ? ?C++中new和delete是對內存分配的運算符,取代了C中的mallocfree

? ? ?標準C++中的字符串類取代了C標準C函數庫頭文件中的字符數組處理函數(C中沒有字符串類型)。

? ? ?C++中用來做控制態輸入輸出的iostream類庫替代了標準C中的stdio函數庫

? ? ?C++中的try/catch/throw異常處理機制取代了標準C中的setjmp()和longjmp()函數。


二、關鍵字和變量

? ? ? C++相對與C增加了一些關鍵字,如下:

typename bool dynamic_cast mutable namespace

static_cast using catch explicit new

virtual operator false private template

volatile const protected this wchar_t

const_cast public throw friend true

reinterpret_cast try

bitor xor_e and_eq compl or_eq

not_eq bitand


在C++中還增加了bool型變量wchar_t型變量

布爾型變量是有兩種邏輯狀態的變量,它包含兩個值:真和假。如果在表達式中使用了布爾型變量,那么將根據變量值的真假而賦予整型值1或0。要把一個整型變量轉換成布爾型變量,如果整型值為0,則其布爾型值為假;反之如果整型值為非0,則其布爾型值為真。布兒型變量在運行時通常用做標志,比如進行邏輯測試以改變程序流程。

[cpp]?view plaincopy
  • #include?iostream.h??
  • ?????????
  • int?main()??
  • {?????????????
  • ????bool?flag;??
  • ????flag?=?true;??
  • ????if(flag)??
  • ????????cout?<<?true?<<?endl;??
  • ??
  • ????return?0;??
  • }??
  • C++中還包括wchar_t數據類型,wchar_t也是字符類型,但是是那些寬度超過8位的數據類型。許多外文字符集所含的數目超過256個,char字符類型無法完全囊括。wchar_t數據類型一般為16位。

    標準C++的iostream類庫中包括了可以支持寬字符的類和對象。用wout替代cout即可。

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • int?main()??
  • {??
  • ????wchar_t?wc;??
  • ????wc?=?'b';??
  • ????wout?<<?wc;??
  • ????wc?=?'y';??
  • ????wout?<<?wc;??
  • ????wc?=?'e';??
  • ????wout?<<?wc?<<?endl;??
  • ??
  • ????return?0;??
  • }??
  • 說明一下:某些編譯器無法編譯該程序(不支持該數據類型)。


    三、強制類型轉換

    ? ? ?有時候,根據表達式的需要,某個數據需要被當成另外的數據類型來處理,這時,就需要強制編譯器把變量或常數由聲明時的類型轉換成需要的類型。為此,就要使用強制類型轉換說明,格式如下:

    int* iptr=(int*) &table;

    表達式的前綴(int*)就是傳統C風格的強制類型轉換說明(typecast),又可稱為強制轉換說明(cast)。強制轉換說明告訴編譯器把表達式轉換成指定的類型。有些情況下強制轉換是禁用的,例如不能把一個結構類型轉換成其他任何類型。數字類型和數字類型、指針和指針之間可以相互轉換。當然,數字類型和指針類型也可以相互轉換,但通常認為這樣做是不安全而且也是沒必要的。強制類型轉換可以避免編譯器的警告。

    [cpp]?view plaincopy
  • long?int?el?=?123;??
  • short?i?=?(int)?el;??
  • ??
  • float?m?=?34.56;??
  • int?i?=?(int)?m;??
  • 上面兩個都是C風格的強制類型轉換,C++還增加了一種轉換方式,比較一下上面和下面這個書寫方式的不同:

    [cpp]?view plaincopy
  • long?int?el?=?123;??
  • short?i?=?int?(el);??
  • ??
  • ??
  • float?m?=?34.56;??
  • int?i?=?int?(m);???
  • 使用強制類型轉換的最大好處就是:禁止編譯器對你故意去做的事發出警告。但是,利用強制類型轉換說明使得編譯器的類型檢查機制失效,這不是明智的選擇。通常,是不提倡進行強制類型轉換的。除非不可避免,如要調用malloc()函數時要用的void型指針轉換成指定類型指針。


    四、標準輸入輸出流

    ? ? ? ?在C語言中,輸入輸出是使用語句scanf()printf()來實現的,而C++中是使用類來實現的

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • main()????//C++中main()函數默認為int型,而C語言中默認為void型。??
  • {??
  • ????int?a;??
  • ????cout?<<?input?a?number:?;??
  • ????cin?>>?a;?????????????/*輸入一個數值*/??
  • ????cout?<<?a?<<?endl;??????//輸出并回車換行??
  • ??????
  • ????return?0;??
  • }??
  • ? ? cin,cout,endl對象,他們本身并不是C++語言的組成部分。雖然他們已經是ANSI標準C++中被定義,但是他們不是語言的內在組成部分。在C++中不提供內在的輸入輸出運算符,這與其他語言是不同的。輸入和輸出是通過C++類來實現的,cin和cout是這些類的實例,他們是在C++語言的外部實現。

    ? ? ?在C++語言中,有了一種新的注釋方法,就是‘//’,在該行//后的所有說明都被編譯器認為是注釋,這種注釋不能換行。C++中仍然保留了傳統C語言的注釋風格/*……*/。
    C++也可采用格式化輸出的方法: [cpp]?view plaincopy
  • #include?iostream.h??
  • ?????????
  • int?main()??
  • {????????????
  • ????int?a;?????????????
  • ????cout?<<?input?a?number:?;???????????
  • ????cin?>>?a;??
  • ?????????????
  • ????cout?<<?dec?<<?a?<<?'?'?????//輸出十進制數?????????????????
  • ????<<?oct?<<?a?<<?'?'?????//輸出八進制數?????????????????
  • ????<<?hex?<<?a?<<?endl;???//輸出十六進制數??
  • ?????????????
  • ????return?0;?????????
  • }??
  • 從上面也可以看出,dec,oct,hex也不可作為變量的標識符在程序中出現。


    五、函數參數問題

    1、無名的函數形參

    ? ? ? ?聲明函數時可以包含一個或多個用不到的形式參數。這種情況多出現在用一個通用的函數指針調用多個函數的場合,其中有些函數不需要函數指針聲明中的所有參數。看下面的例子: [cpp]?view plaincopy
  • int?fun(int?x,int?y)??
  • {??
  • ????return?x*2;??
  • }??
  • ? ? 盡管這樣的用法是正確的,但大多數C和C++的編譯器都會給出一個警告,說參數y在程序中沒有被用到。為了避免這樣的警告,C++允許聲明一個無名形參,以 告訴編譯器存在該參數,且調用者需要為其傳遞一個實際參數,但是函數不會用到這個參數 。下面給出使用了無名參數的C++函數代碼: [cpp]?view plaincopy
  • int?fun(int?x,int)?//注意不同點??
  • {??
  • ????return?x*2;??
  • }??
  • 2、函數的默認參數

    ? ? ?? C++函數的原型中可以聲明一個或多個帶有默認值的參數 。如果調用函數時,省略了相應的實際參數,那么編譯器就會把默認值作為實際參數。可以這樣來聲明具有默認參數的C++函數原型: [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • void?show(int?=?1,float?=?2.3,long?=?6);??
  • ??
  • int?main()??
  • {??
  • ????show();??
  • ????show(2);??
  • ????show(4,5.6);??
  • ????show(8,12.34,50L);??
  • ??????
  • ????return?0;??
  • }??
  • ??
  • void?show(int?first,float?second,long?third)??
  • {??
  • ????cout?<<?first?=<<?first??
  • ????????<<?second?=<<?second??
  • ????????<<?third?=<<?third?<<?endl;??
  • }??
  • 上面例子中,第一次調用show()函數時,讓編譯器自動提供函數原型中指定的所有默認參數,第二次調用提供了第一個參數,而讓編譯器提供剩下的兩個,第三次調用則提供了前面兩個參數,編譯器只需提供最后一個,最后一個調用則給出了所有三個參數,沒有用到默認參數。


    六、函數重載

    在C++中,允許有相同的函數名,不過它們的參數類型不能完全相同,這樣這些函數就可以相互區別開來。而這在C語言中是不允許的。

    1、參數個數不同

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • void?a(int,int);??
  • void?a(int);??
  • ??
  • int?main()??
  • {??
  • ????a(5);??
  • ????a(6,7);??
  • ??????
  • ????return?0;??
  • }??
  • ??
  • ??
  • void?a(int?i)??
  • {??
  • ????cout?<<?i?<<?endl;??//輸出5??
  • }???
  • ??
  • ??
  • void?a(int?i,int?j)??
  • {??
  • ????cout?<<?i?<<?j?<<?endl;???????//輸出67??
  • }??
  • 2.參數格式不同

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • void?a(int,int);??
  • void?a(int,float);??
  • ??
  • int?main()??
  • {??
  • ????a(5,6);??
  • ????a(6,7.0);??
  • ??
  • ????return?0;??
  • }??
  • ??
  • void?a(int?i,int?j)??
  • {??
  • ??
  • ????cout?<<?i?<<?j?<<endl;??????????//輸出56??
  • }???
  • ??
  • void?a(int?i,float?j)??
  • {??
  • ????cout?<<?i?<<?j?<<?endl;??????????//輸出67.0??
  • ??
  • }??

  • 七、變量作用域?? ? ?

    ? ??C++語言中,允許變量定義語句在程序中的任何地方,只要在是使用它之前就可以;而C語言中,必須要在函數開頭部分。而且C++允許重復定義變量,C語言也是做不到這一點的。看下面的程序:

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • int?a;??
  • ??
  • int?main()??
  • {??
  • ????cin?>>?a;??
  • ????for(int?i?=?1;i?<=?10;?i++)?//C語言中,不允許在這里定義變量??
  • ????{??
  • ????????static?int?a?=?0;?//C語言中,同一函數塊,不允許有同名變量??
  • ????????a?+=?i;??
  • ????????cout<<::a<<?<<a<<endl;??
  • ????????}?????????
  • ????return?0;??
  • }??

  • 八、new和delete運算符

    在C++語言中,仍然支持malloc()和free()來分配和釋放內存,同時增加了new和delete來管理內存。

    1.為固定大小的數組分配內存

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • int?main()??
  • {??
  • ????int?*birthday?=?new?int[3];??
  • ????birthday[0]?=?6;??
  • ????birthday[1]?=?24;??
  • ????birthday[2]?=?1940;??
  • ????cout?<<?I?was?born?on??
  • ????????<<?birthday[0]?<<?'/'?<<?birthday[1]?<<?'/'?<<?birthday[2]?<<?endl;??
  • ????delete?[]?birthday;??????//注意這兒??
  • ??????
  • ????return?0;??
  • }??
  • 在刪除數組時,delete運算符后要有一對方括號。

    2.為動態數組分配內存

    [cpp]?view plaincopy
  • #include?iostream.h??
  • #include?stdlib.h??
  • ??
  • int?main()??
  • {??
  • ????int?size;??
  • ????cin?>>?size;??
  • ????int?*array?=?new?int[size];??
  • ????for(int?i?=?0;i?<?size;i++)??
  • ????????array[i]?=?rand();??
  • ????????for(i?=?0;i?<?size;i++)??
  • ????????cout?<<?'\n'?<<?array[i];??
  • ????????delete?[]?array;??
  • ??????
  • ????return?0;??
  • }??

  • 九、引用型變量

    在C++中,引用是一個經常使用的概念。引用型變量是其他變量的一個別名,我們可以認為他們只是名字不相同,其他都是相同的。

    1.引用是一個別名

    ? ??C++中的引用是其他變量的別名。聲明一個引用型變量,需要給他一個初始化值,在變量的生存周期內,該值不會改變。& 運算符定義了一個引用型變量:

    int a;

    int& b=a;

    先聲明一個名為a的變量,它還有一個別名b。我們可以認為是一個人,有一個真名,一個外號,以后不管是喊他a還是b,都是叫他這個人。同樣,作為變量,以后對這兩個標識符操作都會產生相同的效果。

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • int?main()??
  • {??
  • ????int?a?=?123;??
  • ????int&?b?=?a;??
  • ????cout?<<?a?<<?','<<?b?<<?endl;???????//輸出123,123??
  • ????a++;??
  • ????cout?<<?a?<<?','<<?b?<<?endl;???????//輸出124,124??
  • ????b++;??
  • ????cout?<<?a<<?','?<<?b?<<?endl;????????//輸出125,125??
  • ??
  • ????return?0;??
  • }??

  • 2.引用的初始化

    和指針不同,引用變量的值不可改變。引用作為真實對象的別名,必須進行初始化,除非滿足下列條件之一:

    (1) 引用變量被聲明為外部的,它可以在任何地方初始化

    (2) 引用變量作為類的成員,在構造函數里對它進行初始化

    (3) 引用變量作為函數聲明的形參,在函數調用時,用調用者的實參來進行初始化


    3.作為函數形參的引用

    引用常常被用作函數的形參。以引用代替拷貝作為形參的優點:

    引用避免了傳遞大型數據結構帶來的額外開銷

    引用無須象指針那樣需要使用*和->等運算符

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • void?func1(s?p);??
  • void?func2(s&?p);??
  • ??
  • struct?s??
  • {??
  • ????int?n;??
  • ????char?text[10];??
  • };??
  • ??
  • int?main()??
  • {??
  • ????static?s?str?=?{123,China};??
  • ????func1(str);??
  • ????func2(str);??
  • ????return?0;??
  • }??
  • ??
  • void?func1(s?p)??
  • {??
  • ????cout?<<?p.n?<<?endl;??
  • ????cout?<<?p.text?<<?endl;??
  • }??
  • ??
  • ??
  • void?func2(s&?p)??
  • {??
  • ????cout?<<?p.n?<<?endl;??
  • ????cout?<<?p.text?<<?endl;??
  • }??
  • 從表面上看,這兩個函數沒有明顯區別,不過他們所花的時間卻有很大差異,func2()函數所用的時間開銷會比func2()函數少很多。它們還有一個差別,如果程序遞歸func1(),隨著遞歸的深入,會因為棧的耗盡而崩潰,但func2()沒有這樣的擔憂。


    4.以引用方式調用

    當函數把引用作為參數傳遞給另一個函數時,被調用函數將直接對參數在調用者中的拷貝進行操作,而不是產生一個局部的拷貝(傳遞變量本身是這樣的)。這就稱為以引用方式調用。把參數的值傳遞到被調用函數內部的拷貝中則稱為以傳值方式調用。 [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • void?display(const?Date&,const?char*);??
  • void?swapper(Date&,Date&);??
  • ??
  • struct?Date??
  • {??
  • ????int?month,day,year;??
  • };??
  • ??
  • int?main()??
  • {??
  • ????static?Date?now={2,23,90};??
  • ????static?Date?then={9,10,60};??
  • ????display(now,Now:?);??
  • ????display(then,Then:?);??
  • ????swapper(now,then);??
  • ????display(now,Now:?);??
  • ????display(then,Then:?);??
  • ??????
  • ????return?0;??
  • }??
  • ??
  • void?swapper(Date&?dt1,Date&?dt2)??
  • {??
  • ????Date?save;??
  • ????save=dt1;??
  • ????dt1=dt2;??
  • ????dt2=save;??
  • }??
  • ??
  • void?display(const?Date&?dt,const?char?*s)??
  • {??
  • ????cout?<<?s;??
  • ????cout?<<?dt.month?<<?'/'?<<?dt.day?<<?'/'<<?dt.year?<<?endl;??
  • }??

  • 5.以引用作為返回值

    [cpp]?view plaincopy
  • #include?iostream.h??
  • ??
  • struct?Date??
  • {??
  • ????int?month,day,year;??
  • };??
  • ??
  • Date?birthdays[]=??
  • {??
  • ????{12,12,60};??
  • ????{10,25,85};??
  • ????{5,20,73};??
  • };??
  • ??
  • const?Date&?getdate(int?n)??
  • {??
  • ????return?birthdays[n-1];??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?dt=1;??
  • ????while(dt!=0)??
  • ????{??
  • ????????cout<<Enter?date?#?(1-3,0?to?quit)<<endl;??
  • ????????cin>>dt;??
  • ????????if(dt>0?&&?dt<4)??
  • ????????{??
  • ????????????const?Date&?bd?=?getdate(dt);??
  • ????????????cout?<<?bd.month?<<?'/'?<<?bd.day?<<?'/'<<?bd.year?<<?endl;??
  • ????????}??
  • ????}??
  • ????return?0;??
  • } ?
  • 總結

    以上是生活随笔為你收集整理的C++ 学习基础篇(一)—— C++与C 的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。