- 相關(guān)推薦
C語言和C++的區(qū)別精選
C和C++的關(guān)系:就像是win98跟winXP的關(guān)系。C++是在C的基礎(chǔ)上增加了新的理論,玩出了新的花樣。所以叫C加加。以下是小編為大家收集的C語言和C++的區(qū)別精選,歡迎大家借鑒與參考,希望對大家有所幫助。
C語言和C++的區(qū)別1
C是一個結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)。C程序的設(shè)計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)。
C++,首要考慮的是如何構(gòu)造一個對象模型,讓這個模型能夠契合與之對應(yīng)的問題域,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計這個概念已經(jīng)被融入到C++之中 ”。
下面我們一步一步來分析C++與C的不同:
一、類,類對于初學(xué)者,它是一個累贅。類的封裝使得初學(xué)者對程序產(chǎn)生厭倦,感到不適和麻煩。
二、引用,引用是C++中最好盡量不要用它,除非萬不得已。引用對于初學(xué)者就更容易產(chǎn)生混淆,不知道哪個是引用,哪個是變量。
三、函數(shù)的重載,初學(xué)者學(xué)函數(shù)的重載好像沒什么壞處,但是,這會使初學(xué)者潛意識里對C語言的變量類型的重要性產(chǎn)生淡化,要記住C語言是對變量類型最敏感了的,變量的類型在C語言里的'重要性是不言而喻的。
四、流操作符,和上面同樣的道理,使得對變量類型的重要性產(chǎn)生淡化,有時會產(chǎn)生使初學(xué)者莫名其妙的結(jié)果。
五、操作符重載,典型的高級應(yīng)用,初學(xué)者可能根本用不著,這個東東會讓他們覺得C++很難,門檻高,看不懂。
六、繼承,以及虛函數(shù),看起來深奧,實(shí)用價值很低。還有些東東我就不發(fā)表評論了,如:new,操作符等
七、誤區(qū):以問答形式:
問:C++是面向?qū)ο蠡亩鳦是面向過程化的?
答:第二對,第一問錯,C++并非完全面向?qū)ο蠡,真正的面向(qū)ο蠡恼Z言恐怕只有Java才算得上。
問:C++能實(shí)現(xiàn)C所不能的功能嗎?
答:至少我還沒有發(fā)現(xiàn)
問:學(xué)了C再學(xué)C++有障礙嗎?比如程序設(shè)計思想
答:至少我還沒有看見誰有此癥狀。
問:學(xué)了C再學(xué)C++又要重頭開始嗎?
答:不,C++下可以實(shí)現(xiàn)C語言的一切功能。
問:我學(xué)完了C一定還要學(xué)C++才能編程嗎?
答:完全沒必要。
問:C++比C好在哪里?
答:更加符合軟件工程學(xué)
問:學(xué)完了C再學(xué)C++是不是很容易?
答:那要看你是不是真正的學(xué)完了C語言。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣。之所以說C++比C更先進(jìn),是因?yàn)椤?設(shè)計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,錯!算法是程序設(shè)計的基礎(chǔ),好的設(shè)計如果沒有好的算法,一樣不行。而且,“C加上好的設(shè)計”也能寫出非常好的東西。
對語言本身而言,C是C++的子集,那么是什么樣的一個子集?從上文可以看出, C實(shí)現(xiàn)了C++中過程化控制及其它相關(guān)功能,而在C++中的C(我稱它為“C+”),相對于原來的C還有所加強(qiáng),引入了重載、內(nèi)聯(lián)函數(shù)、異常處理等等玩藝兒,C++更是拓展了面向?qū)ο笤O(shè)計的內(nèi)容,如類、繼承、虛函數(shù)、模板和包容器類等等。 再提高一點(diǎn),在C++中,數(shù)據(jù)封裝、類型這些東東已不是什么新鮮事了,需要考慮的是諸如:對象粒度的選擇、對象接口的設(shè)計和繼承、組合與繼承的使用等等問題。
所以相對于C,C++包含了更豐富的“設(shè)計”的概念,但C是C++的一個自洽子集,也具有強(qiáng)大的功能,同樣值得學(xué)習(xí)
小編給的幾點(diǎn)學(xué)習(xí)建議:
1.基本概念很重要。無論學(xué)C,還是學(xué)C++,基本概念都是第一位的,也是比較困難的,但只有把握了基本概念才能把握整體脈絡(luò),才能居高臨下。
2.C是C++的子集,它的基本概念和設(shè)計方法相對比較容易理解,初學(xué)者可從它入手。
3.如果要學(xué)好C++,建議初學(xué)者最好別在如VC,BCB平臺下寫程序,那種自動化的代碼生成,花花綠綠的界面,會讓你手足無措。最好先找一片空地(unix,dos),從頭做起,寫幾個大點(diǎn)的程序,數(shù)個回合,再到VC,BCB下看看,你會輕松得很。在我看來,學(xué)好C/C++是成為VC,BCB高手的必由之路。
4.不要妄想速成,必須得一個byte,一個bit的去摳,盡量搞清楚每一個問題。
C語言和C++的區(qū)別2
C語言和C++的區(qū)別是一個老生常談的問題了,建議題主也善用知乎或者外部的搜索,可以很多角度和很多觀點(diǎn)給你帶來信息。
僅針對你問題描述的問題,是否可以直接上手C++,我的答案是可以,因?yàn)槲揖褪沁@樣子走過來的。
1、 源代碼文件的擴(kuò)展名
摘自1.4.1
C++實(shí)現(xiàn)源代碼文件的擴(kuò)展名UNIXC、cc、cxx、cGNU C++C、cc、cxx、cpp、c++Digital Marscpp、cxxBorland C++cppWatcomcppMicrosoft Visual C++cpp、cxx、ccFreestyle Code Warriorcp、cpp、cc、cxx、c++
另外UNIX系統(tǒng)上的C程序的擴(kuò)展名為.c
2、變量定義
摘自2.2.1
c語言中,所有的局部變量必須在函數(shù)或復(fù)合語句開始位置,c++沒有這個限制。
void main()
{
int a; //define variable a
int b; //define variable b
a = 10;
printf("a=%d ", a);
b = 11;
printf("b=%d ", b);
{
int temp = 0;
printf("test variable in processing ");
}
}
注釋:
a、局部變量a和b位于函數(shù)開始位置,變量temp位于復(fù)合語句的開始位置。
b、復(fù)合語句(摘自5.1.10):使用兩個花括號來構(gòu)造一條復(fù)合語句(代碼塊)。代碼塊由一對花括號和它們包含的語句組成。
3、 auto
摘自3.4.5
c語言中, auto用于聲明變量為自動變量,auto修飾符的定義里有這么一句“進(jìn)入包含變量聲明的代碼時,變量開始存在。當(dāng)程序離開這個代碼塊時,自動變量消失了。它所占用的內(nèi)存可用來做別的事情!,從“當(dāng)程序離開代碼塊時變量消失”、“內(nèi)存可用來做別的事情”可以推出auto修飾的變量是存儲在堆棧中的。而全局變量存儲在靜態(tài)存儲區(qū)中,所以用auto決不能修飾全局變量。
C++11標(biāo)準(zhǔn)引入auto類型說明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類型。
與原來那些只對應(yīng)一種特定類型的說明符不同,auto讓編譯器通過初值來推算變量類型。顯然,auto定義的變量必須要有初始值。
auto i=0,*p=&i; //正確,i是整數(shù),p是整形指針
4、stuct
摘自4.4
在C語言中, struct類型的定義必須加上struct的前綴
struct opt {
int len;
int value;
};
void main()
{
struct opt tmp;
tmp.len = 1;
tmp.value = 2;
}
而在C++中,struct可以直接使用其類型名來定義
#include <iostream>
struct opt {
int len;
int value;
};
int main()
{
opt tmp;
tmp.len = 1;
tmp.value = 2;
std::cout<<tmp.len<<std::endl;
std::cout<<tmp.value<<std::endl;
return 0;
}
相比之下,C++的語法更簡潔一些。所以在用C語言編寫代碼的時候,C程序員通常是這么來定義的struct的。在下面的代碼中,使用typedef來定義一個opt的類型
typedef struct _opt {
int len;
int value;
}opt;
void main()
{
opt tmp;
tmp.len = 1;
tmp.value = 2;
}
5、stuct初始化
推薦一個我自己的C/C++交流群 815393859
摘自4.4.2
與數(shù)組一樣,c++11也支持將列表初始化用于結(jié)構(gòu),且等號(=)是可選的.:
opt tmp {1, 2};
其中不允許縮窄轉(zhuǎn)換,例如:
opt tmp {1.0, 2};
編譯報錯:
error: narrowing conversion of ‘1.0e+0’ from ‘double’ to ‘int’ inside { }
c語言可以使用列表初始化,但是等號(=)是必須的。
opt tmp = {1,2};
6、枚舉的取值范圍
摘自4.6.2
c++現(xiàn)在通過強(qiáng)制類型轉(zhuǎn)換,增加了可以賦值給枚舉變量的合法值。
每個枚舉都有取值范圍,通過強(qiáng)制類型轉(zhuǎn)換,可以將取值范圍中的任何整數(shù)賦值給枚舉變量,即使這個值不是枚舉值例如,假設(shè)bits 和myflag 的定義如下:
enum bits{ one=1,two=2,four=4,eight=8};
bits myflag;
則下面的代碼是合法的:
myflag=bits(6);//正確,因?yàn)?6在bits的范圍
取值范圍的定義:首先,要找出上限,需要知道枚舉量的最大值。找到大于這個最大值的、最小的2的冪,將它減去1,得到的便是取值范圍的上限。
例如對于:
enum bigstep{first,second = 100,third};
最大枚舉值是101,在2的冪中,比這個值大的最小的值為128,因此取值范圍上限為127.
要知道下限,需要知道枚舉量的最小值.如果它不小于0,則取值范圍的下限為0.否則,采取與尋找上限方式同樣的方式,但加上負(fù)號,
例如,如果最小的枚舉量為-6,則比它小的,2的冪最大的值為-8,加1之后為-7.于是,上限與下限便能算出來.
c語言中不能定義這樣的變量:bits myflag;
7、for循環(huán)
摘自5.1
C++11新增一種循環(huán):基于范圍(range-based)的for循環(huán):簡化一種常見的循環(huán)任務(wù):對數(shù)組(或容器類,如vector和array)的每個元素執(zhí)行相同的操作.
格式如下:
for(Type VarName : Array){
//每個元素的值會依次賦給 VarName
}
示例:
double prices[5]={4.99, 2.33, 5.86, 6.42, 4.51};
for (double x : prices)
std::cout<<x<<std::endl;
8、邏輯運(yùn)算符的另一種表示
摘自6.2.6
并不是所有的鍵盤都提供了用作邏輯運(yùn)算符的符號,標(biāo)識符and、or和not都是c++保留字,這意味著不能將它們用作變量名等。它們不是關(guān)鍵字,因?yàn)樗鼈兌际且延姓Z言特性的另一種表示方式。另外,它們并不是c語言中的保留字,但c語言程序可以將它們用作運(yùn)算符,只要在程序中包含了頭文件iso646.h.
邏輯運(yùn)算符:另一種表示方式
運(yùn)算符另一種表示方式&&and||or!not
9、c++字符庫函數(shù)cctype
摘自6.3
cctype中通常包括一些常用函數(shù)的判斷,如某個字符是否為大寫,用isupper()如果參數(shù)是大寫字母,函數(shù)返回true, 還有像isalnum(),如果參數(shù)是字母數(shù)字,即字母或者數(shù)字,函數(shù)返回true.
函數(shù)名稱 返回值
isalnum() 如果參數(shù)是字母數(shù)字,即字母或者數(shù)字,函數(shù)返回true
isalpha() 如果參數(shù)是字母,函數(shù)返回true
isblank() 如果參數(shù)是水平制表符或空格,函數(shù)返回true
iscntrl() 如果參數(shù)是控制字符,函數(shù)返回true
isdigit() 如果參數(shù)是數(shù)字(0-9),函數(shù)返回true
isgraph() 如果參數(shù)是除空格之外的打印字符,函數(shù)返回true
islower() 如果參數(shù)是小寫字母,函數(shù)返回true
isprint() 如果參數(shù)是打印字符(包括空格),函數(shù)返回true
ispunct() 如果參數(shù)是標(biāo)點(diǎn)符號,函數(shù)返回true
isspace() 如果參數(shù)是標(biāo)準(zhǔn)空白字符,如空格、換行符、水平或垂直制表符,函數(shù)返回true
isupper() 如果參數(shù)是大寫字母,函數(shù)返回true
isxdigit() 如果參數(shù)是十六進(jìn)制數(shù)字,即0-9、a-f、A-F,函數(shù)返回true
tolower() 如果參數(shù)是大寫字符,返回其小寫,否則返回該參數(shù)
toupper() 如果參數(shù)是小寫字符,返回其大寫,否則返回該參數(shù)
10 、wchar_t 和C++11新增類型:char16_t char32_t
摘自3.1.8
wcha_t:
wchar_t是C/C++的字符類型,是一種擴(kuò)展的存儲方式,主要用在國際化程序的實(shí)現(xiàn)中。
wchar_t 存在的原因:
char是八位字符類型,最多能包含256中字符,許多的外文字符集所包含的字符數(shù)目超過256個,char型不能表示。
wchar_t數(shù)據(jù)大小:
數(shù)據(jù)類型一般為16或者32位,不同的C/C++庫有不同的規(guī)定?傊簑char_t所能表示的字符遠(yuǎn)遠(yuǎn)多于char類型。
wchar_t的輸入輸出處理:
cin和cout將輸入和輸出看作是char流,因此不適合用于處理wchat類型,iostream頭文件提供了wcin 和wcout用于處理輸入輸出流另外可以通過加上前綴L來只是寬字符常量和寬字符串。
char16_t和char32_t:
產(chǎn)生原因:
隨著編程人員日益的熟悉Unicode,類型wchar_t顯然已經(jīng)滿足不了需求,在計算機(jī)系統(tǒng)上進(jìn)行的編碼字符和字符串編碼時,僅僅使用Unicode碼點(diǎn)顯然是不夠的,
比如:如果在進(jìn)行字符串編碼時,如果有特定長度和符號特征的類型將很有幫助,而類型wchar_t的長度和符號特征隨實(shí)現(xiàn)而已,因此C++11新增了類型char16_t,char32_t。
char16_t:無符號類型,長16位,
char32_t無符號類型,長32位
C++11使用前綴u表示char16_t字符常量和字符串常量如:u‘L’;u“l(fā)ilili”;
C++11使用前綴U表示char32_t字符常量和字符串常量如:U'L';U"lilili";
類型char16_t與/u00F6形式的通用字符名匹配,
類型char32_t與/U0000222B形式的通用字符名匹配。
前綴u和U分別指出字符字面值的類型為char16_t和char32_t。
11、函數(shù)重載
摘自8.4
C++ 允許多個函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載(Function Overloading)。借助重載,一個函數(shù)名可以有多種用途。
void test(int tmp1, int tmp2)
{
std::cout << tmp1 <<std::endl;
std::cout << tmp2 <<std::endl;
}
void test(double tmp1, double tmp2)
{
std::cout << tmp1 <<std::endl;
std::cout << tmp2 <<std::endl;
}
函數(shù)的重載的規(guī)則:
函數(shù)名稱必須相同。
參數(shù)列表必須不同(個數(shù)不同、類型不同、參數(shù)排列順序不同等)。
函數(shù)的返回類型可以相同也可以不相同。
僅僅返回類型不同不足以成為函數(shù)的重載。
C++ 是如何做到函數(shù)重載的
C++代碼在編譯時會根據(jù)參數(shù)列表對函數(shù)進(jìn)行重命名。當(dāng)發(fā)生函數(shù)調(diào)用時,編譯器會根據(jù)傳入的實(shí)參去逐個匹配,以選擇對應(yīng)的函數(shù),如果匹配失敗,編譯器就會報錯,這叫做重載決議(Overload Resolution)。
在C語言中,不存在函數(shù)重載,原因?yàn)橐院瘮?shù)名來唯一區(qū)分一個全局函數(shù)。而在c++中 以函數(shù)名+參數(shù)列表來唯一區(qū)分函數(shù)。
12、引用
摘自8.2
引用(reference)是c++對c語言的重要擴(kuò)充。引用就是某一變量(目標(biāo))的一個別名,對引用的操作與對變量直接操作完全一樣。其格式為:類型 &引用變量名 = 已定義過的變量名。
引用的特點(diǎn):
1. 一個變量可取多個別名。
2. 引用必須初始化。
3. 引用只能在初始化的時候引用一次 ,不能更改為轉(zhuǎn)而引用其他變量。
總結(jié):
1. 不要返回一個臨時變量的引用。
2. 如果返回對象出了當(dāng)前函數(shù)的作用域依舊存在,則最好使用引用返回,因?yàn)檫@樣更高效。
* 引用和指針的區(qū)別和聯(lián)系
1. 指針是一個實(shí)體,而引用僅是個別名;
2. 引用使用時無需解引用(*),指針需要解引用;
3. 引用只能在定義時初始化一次,之后不能改變指向其它變量(從一而終);指針變量的值可變。
4. 引用必須指向有效的變量,指針可以為空。
5. sizeof指針對象和引用對象的意義不一樣。sizeof引用得到的是所指向的變量的大小,而sizeof指針是對象地址的大小。
6. 指針和引用自增(++)自減(--)意義不一樣。
7. 相對而言,引用比指針更安全。
8. 從內(nèi)存分配上看:程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域。
* 相同點(diǎn):兩者都是地址的概念,指針指向一塊兒內(nèi)存,其內(nèi)容為所指內(nèi)存的地址;引用是某塊兒內(nèi)存的別名。
指針比引用更為靈活,但是其風(fēng)險也很大。使用指針時一定要檢查指針是否為空(NULL),且空間回收后指針最好置零,以免野指針的發(fā)生造成內(nèi)存泄漏等問題。
#include <iostream>
int main()
{
struct student{
std::string name;
int num;
};
student lily = {"andrew", 168};
const student &ref = lily;
student *p = &lily;
std::cout << sizeof ref<< "= sizeof ref ";
std::cout << sizeof p<< "= sizeof pointer ";
}
執(zhí)行結(jié)果:
16= sizeof ref
8= sizeof pointer
【C語言和C++的區(qū)別】相關(guān)文章:
C++、C語言和JAVA開發(fā)的區(qū)別06-28
淺談c語言和c++和VB的區(qū)別07-04
C++、C語言和JAVA開發(fā)有哪些區(qū)別08-09
C語言和C++的分別06-18
Java與C/C++的區(qū)別06-18
C語言和C++有什么關(guān)系09-23
C/C++內(nèi)存管理09-20
C++類的轉(zhuǎn)換10-17
c++快速排序詳解10-18