![c語言讀后感(4篇)_第1頁](http://file4.renrendoc.com/view/1b00017975a95a903764e1d279cd6014/1b00017975a95a903764e1d279cd60141.gif)
![c語言讀后感(4篇)_第2頁](http://file4.renrendoc.com/view/1b00017975a95a903764e1d279cd6014/1b00017975a95a903764e1d279cd60142.gif)
![c語言讀后感(4篇)_第3頁](http://file4.renrendoc.com/view/1b00017975a95a903764e1d279cd6014/1b00017975a95a903764e1d279cd60143.gif)
![c語言讀后感(4篇)_第4頁](http://file4.renrendoc.com/view/1b00017975a95a903764e1d279cd6014/1b00017975a95a903764e1d279cd60144.gif)
![c語言讀后感(4篇)_第5頁](http://file4.renrendoc.com/view/1b00017975a95a903764e1d279cd6014/1b00017975a95a903764e1d279cd60145.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
本文格式為Word版,下載可任意編輯——c語言讀后感(4篇)讀后感,就是看了一部影片,連續(xù)劇或參觀展覽等后,把具體感受和得到的啟示寫成的文章。讀后感對于我們來說是十分有幫助的,那么我們該如何寫好一篇讀后感呢?這里我整理了一些優(yōu)秀的讀后感范文,希望對大家有所幫助,下面我們就來了解一下吧。
c語言讀后感篇一
轉(zhuǎn)載▼
標簽:
it
c++本身并沒有提供任何多線程機制,但是在windows下,我們可以調(diào)用sdkwin32api來編寫多線程的程序,下面就此簡單的講一下:
創(chuàng)立線程的函數(shù)
handlecreatethread(lpsecurity_attributeslpthreadattributes,//sd
size_tdwstacksize,//initialstacksize
lpthread_start_routinelpstartaddress,//threadfunction
lpvoidlpparameter,//threadargument
dworddwcreationflags,//creationoption
lpdwordlpthreadid//threadidentifier);
在這里我們只用到了第三個和第四個參數(shù),第三個參數(shù)傳遞了一個函數(shù)的地址,也是我們要指定的新的線程,第四個參數(shù)是傳給新線程的參數(shù)指針。
eg1:
#include
dwordwinapifun(lpvoidlpparamter)
{
while(1){cout“fundisplay!〞}
intmain()
{
handlehthread=createthread(null,0,fun,null,0,null);
closehandle(hthread);
while(1){cout“maindisplay!〞return0;
}
我們可以看到主線程(main函數(shù))和我們自己的線程(fun函數(shù))是隨機地交替執(zhí)行的,但是兩個線程輸出太快,使我們很難看明白,我們可以使用函數(shù)
voidsleep(dworddwmilliseconds//sleeptime);
來暫停線程的執(zhí)行,dwmilliseconds表示千分之一秒,所以
sleep(1000);
表示暫停1秒
eg2:
#include
dwordwinapifun(lpvoidlpparamter)
{
while(1){cout“fundisplay!〞}
intmain()
{
handlehthread=createthread(null,0,fun,null,0,null);
closehandle(hthread);
while(1){cout“maindisplay!〞return0;
}
執(zhí)行上述代碼,這次我們可以明白地看到在屏幕上交織地輸出fundisplay!和maindisplay!,我們發(fā)現(xiàn)這兩個函數(shù)確實是并發(fā)運行的,細心的讀者可能會發(fā)現(xiàn)我們的程序是每當fun函數(shù)和main函數(shù)輸出內(nèi)容后就會輸出換行,但是我們看到的確是有的時候程序輸出換行了,有的時候確沒有輸出換行,甚至有的時候是輸出兩個換行。這是怎么回事?下面我們把程序改一下看看:
eg3:
#include
dwordwinapifun(lpvoidlpparamter)
{
while(1){cout“fundisplay!n〞;sleep(1000);}
}
intmain()
{
handlehthread=createthread(null,0,fun,null,0,null);
closehandle(hthread);
while(1){cout“maindisplay!n〞;sleep(2000);}
return0;
}
我們再次運行這個程序,我們發(fā)現(xiàn)這時候正如我們預期的,正確地輸出了我們想要輸出的內(nèi)容并且格式也是正確的。下面我就來講一下此前我們的程序為什么沒有正確的運行。多線程的程序時并發(fā)地運行的,多個線程之間假使公用了一些資源的話,我們并不能保證這些資源都能正確地被利用,由于這個時候資源并不是獨占的,舉個例子吧:
eg4:
參與有一個資源inta=3
有一個線程函數(shù)selfadd()該函數(shù)是使a+=a;
又有一個線程函數(shù)selfsub()該函數(shù)是使a-=a;
我們假設上面兩個線程正在并發(fā)欲行,假使selfadd在執(zhí)行的時候,我們的目的是想讓a編程6,但此時selfsub得到了運行的機遇,所以a變成了0,等到selfadd的到執(zhí)行的機遇后,a+=a,但是此時a確是0,并沒有如我們所預期的那樣的到6,我們回到前面eg2,在這里,我們可以把屏幕看成是一個資源,這個資源被兩個線程所共用,參與當fun函數(shù)輸出了fundisplay!后,將要輸出endl(也就是清空緩沖區(qū)并換行,在這里我們可以不用理
解什么事緩沖區(qū)),但此時main函數(shù)確得到了運行的機遇,此時fun函數(shù)還沒有來得及輸出換行就把cpu讓給了main函數(shù),而這時main函數(shù)就直接在fundisplay!后輸出maindisplay!,至于為什么有的時候程序會連續(xù)輸出兩個換行,讀者可以采用同樣的分析方法來分析,在這里我就不多講了,留給讀者自己思考了。
那么為什么我們把eg2改成eg3就可以正確的運行呢?原因在于,多個線程雖然是并發(fā)運行的,但是有一些操作是必需一氣呵成的,不允許打斷的,所以我們看到eg2和eg3的運行結(jié)果是不一樣的。
那么,是不是eg2的代碼我們就不可以讓它正確的運行呢?答案當然是否,下面我就來講一下怎樣才能讓eg2的代碼可以正確運行。這涉及到多線程的同步問題。對于一個資源被多個線程共用會導致程序的混亂,我們的解決方法是只允許一個線程擁有對共享資源的獨占,這樣就能夠解決上面的問題了。
handlecreatemutex(lpsecurity_attributeslpmutexattributes,//sd
boolbinitialowner,//initialowner
lpctstrlpname//objectname);
該函數(shù)用于創(chuàng)造一個獨占資源,第一個參數(shù)我們沒有使用,可以設為null,其次個參數(shù)指定該資源初始是否歸屬創(chuàng)立它的進程,第三個參數(shù)指定資源的名稱。
handlehmutex=createmutex(null,true,“screen〞);
這條語句創(chuàng)造了一個名為screen并且歸屬于創(chuàng)立它的進程的資源
boolreleasemutex(handlehmutex//handletomutex);
該函數(shù)用于釋放一個獨占資源,進程一旦釋放該資源,該資源就不再屬于它了,假使還要用到,需要重新申請得到該資源。申請資源的函數(shù)如下
dwordwaitforsingleobject(handlehhandle,//handletoobject
dworddwmilliseconds//time-outinterval);
第一個參數(shù)指定所申請的資源的句柄,其次個參數(shù)一般指定為infinite,表示假使沒有申請到資源就一直等待該資源,假使指定為0,表示一旦得不到資源就返回,也可以具體地指定等待多久才返回,單位是千分之一秒。好了,該到我們來解決eg2的問題的時候了,我們可以把eg2做一些修改,如下
eg5:
#include
handlehmutex;
dwordwinapifun(lpvoidlpparamter)
{
while(1){
waitforsingleobject(hmutex,infinite);
cout“fundisplay!〞sleep(1000);
releasemutex(hmutex);
}
}
intmain()
{
handlehthread=createthread(null,0,fun,null,0,null);hmutex=createmutex(null,false,“screen〞);
closehandle(hthread);
while(1){
waitforsingleobject(hmutex,infinite);
cout“maindisplay!〞sleep(2000);
releasemutex(hmutex);
}
return0;
}
運行代碼正如我們所預期的輸出的內(nèi)容。
/*char*s=newchar[5];strcpy(s,〞abcd“);
}coutchar*s=〞“;//分派了內(nèi)存空間,但不知道大小strcpy(s,〞abcd“);//錯誤,使用時要注意??!cout3.指針
3.1指針可執(zhí)行的運算
指針可以進行賦值運算、算術(shù)運算、關系運算。
1可以將與指針變量同類型的任一變量的地址賦給指針○2在c++中,可以(1)賦值運算:○
3同類型的指針變量之間可以將0賦給任一指針變量,其含義是初始化指針變量,使其為空○相互賦值,不同類型的經(jīng)強制轉(zhuǎn)換后也可以,尋常也沒意義。(2)算術(shù)運算:指針變量執(zhí)行“++〞或“——〞,其含義是使指針變量指向下一個或上一個元素
3.2指針和數(shù)組(同1.2)3.3指向數(shù)組的指針變量
char(*p)[10];(*p)指明p是一個指針變量,再與[10]結(jié)合,表示該指針變量所指向的數(shù)據(jù)是一個一維數(shù)組,該數(shù)組由10個元素組成。3.4指針數(shù)組
由若干個同類型的指針所組成的數(shù)組稱為指針數(shù)組,數(shù)組的每個元素都是一個指針變量。定義指針數(shù)組的格式:如char*p[10];由于“[]〞的優(yōu)先級比“*〞高,p[10]構(gòu)成一個數(shù)組,再與“*〞結(jié)合,指明是一個指針數(shù)組。3.5指向指針的指針變量char**pp;3.6new運算符
注意點:
用new運算符分派的內(nèi)存空間的指針值必需保存起來,以便于delete運算符歸還已動態(tài)分派的內(nèi)存,否則會出現(xiàn)不可預計的錯誤。3.6.1指向數(shù)組的指針char*m_p1;m_p1=newchar[10];//指針m_p1指向含有10個元素的數(shù)組空間。for(i=0;i10;i++)m_p2[i]表示這10個數(shù)組元素。
voidmain(){char*p1;//charb;p1=newchar[5];
//p1=〞abcde“;//直接給p1賦字符串,下面for循環(huán)中是給每個元素賦值。for(inti=0;i5;i++){//b='c';
}p1[i]='a';//p1[i]是數(shù)組元素,不是指針
cout3.6.2指向指針的指針變量char**m_p2;//指向指針的指針
m_p2=newchar*[10];//指針m_p2指向含有10個元素的指針數(shù)組。for(i=0;i10;i++)m_p2[i]表示這10個指針。
voidmain(){char*p1;char**pp;p1=newchar[5];pp=newchar*[5];for(inti=0;i5;i++){
p1[i]='a';=p1[i];//pp[i]是指針
coutcout3.7delete運算符
delete釋放的不是指針本身,而是指針所指的對象。
4.容器類std::string#include#include
std::stringstr=〞abc“;
std::string::iteratorcit=();
for(;cit!=null;++cit)//null比較,我估計確定不對,雖然你說是可以通過編譯
{
std::cout*cit}
return0;}
4.容器類vector4.1迭代器和指針的區(qū)別
有時需要使用指向vector的一個指針,我們可以這樣來做。
vectorv;
假使你在一個不好的環(huán)境中,()代替v[0],由于(這些厭惡的家伙將會告訴你)begin返回指向vector內(nèi)部的迭代器,而對于vector,其迭代器實際上是指針。那經(jīng)常是正確的,但正如條款50所說,并不總是如此,你不該依靠于此。
begin的返回類型是iterator,而不是一個指針,當你需要一個指向vector內(nèi)部數(shù)據(jù)的指針時絕不該使用begin。(),就應當鍵入*(),由于這將會產(chǎn)生和v[0]一致的指針。
這說明迭代器的內(nèi)容*()才是vector中第一個元素。
4.2容器vector的函數(shù)clear()
清空vector里所有的元素。因此,如amprocesslist析構(gòu)函數(shù)里一個個刪除vector中所有的元素是多此一舉。
5.關鍵字operator它是說明符,用于重載運算符。
6.函數(shù)可以將一個處理的結(jié)果值通過函數(shù)的return語句返回,也可以通過參數(shù)將處理的多個結(jié)果帶給調(diào)用者。
c++語言在處理函數(shù)調(diào)用時,參數(shù)是自右向左依次入棧的
7.類的前置聲明
char*bjarne在他的thec++programminglanguage里面給出過一個助記的方法:把一個聲明從右向左讀。
char*constcp;(*讀成pointerto)cpisaconstpointertocharcp是一個指向字符char的固定指針
constchar*ptr;ptrisapointertoconstchar;ptr是一個指向固定字符char的指針
charconst*p;無此形式也就是說,cp和ptr都是指針,cp的值是不可改變的cp指向的內(nèi)容是可變的;而ptr的值是可以改變的,ptr指向的內(nèi)容是不可變的
轉(zhuǎn)化為constchar*,constchar*轉(zhuǎn)化為char*1.在string里面string.c_str()函數(shù)把string轉(zhuǎn)換為了constchar*.○代碼如下:
stringa=〞abcd“;constchar*p=a.c_str();2const_cast將constchar*轉(zhuǎn)換為char*.○char*p=const_cast(a.c_str());
char*p;char*s=〞“;char*t=null;p沒分派內(nèi)存,s分派了內(nèi)存,t為空,11.變量的初始化1指針需要初始化;○2基本數(shù)據(jù)類型聲明的變量需要初始化;如doublem_dvalue;m_dvalue=0;○3類聲明的對象不需要初始化?!?/p>
12.派生類中的一般成員函數(shù)和虛函數(shù)classa{public:voidsolid(){cout〞基類實函數(shù)“'n';}virtualvoidvir(){cout〞基類虛函數(shù)“'n';}};classaa:publica{public:voidsolid(){cout〞派生類實函數(shù)“'n';}virtualvoidvir(){cout〞派生類虛函數(shù)“'n';}};
voidmain(){a*a=newa;aa*aa=newaa;a=aa;
a-vir();//vir()是虛函數(shù)。它是運行時的多態(tài)性,即在程序運行時,根據(jù)具體的執(zhí)行狀況來動態(tài)的確定。因此輸出〞派生類虛函數(shù)“,而不是“基類虛函數(shù)〞
a-solid();//solid()是一般成員函數(shù)。它是編譯時的多態(tài)性,即程序編譯時就覺得會調(diào)用哪個函數(shù)。由于a是a類對象的指針,即使派生類aa對象的指針aa賦給a,在編譯是已經(jīng)覺得調(diào)用基類a的solid函數(shù),因此輸出“基類虛函數(shù)〞而不是“派生類虛函數(shù)〞
aa-vir();aa-solid();
aa-a::solid();aa-a::vir();}
buttonnewbtn=newbutton();on=new(128,110);=〞newbtn“;=new(75,23);=〞button2";ualstylebackcolor=true;(newbtn);
///清除新生成的btn(newbtn);
cbutton*ctexteditorview::newmybutton(intnid,crectrect,intnstyle){cstringm_caption;ring(nid);//取按鈕標題cbutton*p_button=newcbutton();assert_valid(p_button);p_button-create(m_caption,ws_child|ws_visible|bs_pushbutton|nstyle,rect,this,nid);//創(chuàng)立按鈕returnp_button;}
c語言讀后感篇四
unitone對象的演化
oop技術(shù)能夠很簡單地將大量問題歸納為一個簡單的解,這一發(fā)現(xiàn)產(chǎn)生了大量的oop語言,其中最著名的是smalltalk—c++之前最成功的oop語言。
繼承表示了基本類型和派生類型之間的相像性,程序員創(chuàng)立一個基本類型以描述系統(tǒng)中一些對象的思想核心。由這個基本類型派生出其他類型,表達了認識該核心的不同途徑。
早捆綁意味著編譯器對特定的函數(shù)名產(chǎn)生調(diào)用,而連接器確定調(diào)用執(zhí)行代碼的絕對地址。對于。oop采用動態(tài)綁定。當給對象發(fā)送消息時,在程序運行之前不去確定被調(diào)用的代碼。編譯器保證這個被調(diào)用的函數(shù)存在,并完成參數(shù)和返回值的類型檢查,但是它不知道將執(zhí)行的確鑿代碼。為了實現(xiàn)晚捆綁,編譯器在真正調(diào)用的地方插入一段特別的二進制代碼。通過使用存放在對象自身中的信息,這段代碼在運行時計算被調(diào)用函數(shù)的地址。這樣,每個對象就能根據(jù)一個指針的內(nèi)容有不同的行為。當一個對象接收到消息時,它根據(jù)這個消息判斷應當做什么。
程序員可以用關鍵字virtual說明他希望某個函數(shù)有晚捆綁的靈活性,而并不需要懂得virtual的使用機制。沒有它,就不能用c++做面向?qū)ο蟮某绦蛟O計。virtual函數(shù)(虛函數(shù))表示允許在一致家族中的類有不同的行為。這些不同是引起多態(tài)行為的原因。
用c語言編寫的過程程序就是一些數(shù)據(jù)定義和函數(shù)調(diào)用。要理解這種程序的含義,程序員必需把握函數(shù)調(diào)用和函數(shù)實現(xiàn)的本身。這就是過程程序需要中間表示的原因。中間表示簡單引起混淆,由于中間表示的表述是原始的,更偏向于計算機,而不偏向于所解決的問題。
尋常,面向?qū)ο蟪绦蛐枰^少的代碼,由于問題中的大量部分都可以用已存在的庫代碼。
c++成功的原因是經(jīng)濟上的:轉(zhuǎn)變到oop需要代價,而轉(zhuǎn)變到c++所花的代價較小。盡可能地為程序員提供最大便利。
為c++堵塞了c語言中的一些漏洞,并提供更好的類型檢查和編譯時的分析。程序員必需先說明函數(shù),使編譯器能檢查它們的使用狀況。預處理器虛擬刪除值替換和宏,這就減少了查找疵點的困難。c++有一特性能,稱為references(引用),它允許對函數(shù)參數(shù)和返回值的地址進行更便利的處理。函數(shù)重載改進了對名字的處理,使程序員能對不同的函數(shù)使用一致的名字。另外,名字空間也加強了名字的控制。大量性能使c的更安全。面向?qū)ο蟮腸++程序的速度與用c寫的程序速度相差在±10%之內(nèi),而且往往更接近。用oop方法設計的程序可能比c的對應版本更有效。
c++的主要目標是讓程序員能更簡單地使用庫,這是通過將庫轉(zhuǎn)換為新數(shù)據(jù)類型(類)來完成的。引入一個庫,就是向該語言增加一個新類型。編譯器負責這個庫如何使用,保證適當?shù)某跏蓟颓宄?,保證函數(shù)被正確地調(diào)用。
?模板的源代碼重用
一些重要的類型要求修改源代碼以便有效地重用。模板可以自動完成對代碼的修改,因而是重用庫代碼特別有用的工具。用模板設計的類型很簡單與其他類型一起工作。由于模板對程序員隱蔽了這類代碼重用的繁雜性,所以特別好用。
c++的異常處理(見第17章的內(nèi)容)保證能檢查到錯誤并進行處理。
c語言同樣有這樣的限制,例如當程序超過50000行時,名字沖突就開始成為問題。簡言之,程序員用光了函
數(shù)和變量名。設計c++的目的是為了輔助大程序設計,也就是說,去掉小程序和大程序之間繁雜性的分界。
程序設計有兩個原則:
1)內(nèi)部原則表達在程序自身的結(jié)構(gòu)中,精明而有見解的程序員可以通過程序設計語言的表達方式了解這種內(nèi)部原則。
2)外部原則表達在程序的源信息中,一般被描述為“設計文檔〞(不要與產(chǎn)品文檔混淆)。
過程語言:為科學工使用的fortran(formula-translation)和為商業(yè)者使用的cobol
(commonbusiness-orientedlanguage)。純計算機科學中很成功的語言是lisp(list-processing),而面向數(shù)學的語言應當是apl(aprogramminglanguage)。
1.3.4對象設計的五個階段
1)對象發(fā)現(xiàn)這個階段出現(xiàn)在程序的最初分析期間。可以通過尋覓外部因素與界限、系統(tǒng)中的元素副本和最小概念單元而發(fā)現(xiàn)對象。假使已經(jīng)有了一組類庫,某些對象是很明顯的。類之間的共同性(示意了基類和繼承類),可以立刻出現(xiàn)或在設計過程的后期出現(xiàn)。
2)對象裝配我們在建立對象時會發(fā)現(xiàn)需要一些新成員,這些新成員在對象發(fā)現(xiàn)時期未出現(xiàn)過。對象的這種內(nèi)部需要可能要用新類去支持它。
3)系統(tǒng)構(gòu)造對對象的更多要求可能出現(xiàn)在以后階段。隨著不斷的學習,我們會改進我們的對象。與系統(tǒng)中其它對象通訊和相互連接的需要,可能改變已有的類或要求新類。
4)系統(tǒng)擴展當我們向系統(tǒng)增加新的性能時,可能發(fā)現(xiàn)我們從前的設計不簡單支持系統(tǒng)擴展。這時,我們可以重新構(gòu)造部分系統(tǒng),并很可能要增加新類。
5)對象重用這是對類的真正的重點測試。假使某些人試圖在全新的狀況下重用它,他們
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司管理協(xié)議合同范本
- 云南中醫(yī)藥大學《軟件工程技術(shù)基礎》2023-2024學年第二學期期末試卷
- 銀川能源學院《電路分析基礎C》2023-2024學年第二學期期末試卷
- 山東第一醫(yī)科大學《大數(shù)據(jù)采集技術(shù)與應用實踐》2023-2024學年第二學期期末試卷
- 江西信息應用職業(yè)技術(shù)學院《明清小說與民俗文化》2023-2024學年第二學期期末試卷
- 2024年02月廣西廣發(fā)銀行南寧分行(籌)招考筆試歷年參考題庫附帶答案詳解
- 人形機器人機器學習與自主決策系統(tǒng)
- 電火鍋電蒸鍋行業(yè)發(fā)展驅(qū)動因素
- 沈陽農(nóng)業(yè)大學《運動生物力學(康復)》2023-2024學年第二學期期末試卷
- 2024年02月廣東2024年廣發(fā)銀行廣州分行春季校園招考筆試歷年參考題庫附帶答案詳解
- 武漢2025年湖北武漢理工大學管理人員招聘筆試歷年參考題庫附帶答案詳解
- 使用錯誤評估報告(可用性工程)模版
- 2024年高考全國甲卷英語試卷(含答案)
- 2024年湖南高速鐵路職業(yè)技術(shù)學院單招職業(yè)技能測試題庫附答案
- 第四章《數(shù)列》復習小結(jié)示范公開課教學PPT課件【高中數(shù)學人教A版】
- GB/T 8944.1-2008紙漿成批銷售質(zhì)量的測定第1部分:漿板漿包及漿塊(急驟干燥漿)漿包
- 蘇教版(蘇少版)九年級美術(shù)下冊全冊課件
- 2022年江蘇省鹽城市中考英語試題及參考答案
- 中國文化簡介英文版(ChineseCultureintroduction)課件
- 文化差異與跨文化交際課件(完整版)
- 工程經(jīng)濟學完整版課件全套ppt教程
評論
0/150
提交評論