c語言讀后感(四篇)

格式:DOC 上傳日期:2023-01-11 10:57:58
c語言讀后感(四篇)
時間:2023-01-11 10:57:58     小編:zdfb

當(dāng)品味完一部作品后,一定對生活有了新的感悟和看法吧,讓我們好好寫份讀后感,把你的收獲感想寫下來吧??墒亲x后感怎么寫才合適呢?下面是我給大家整理的讀后感范文,歡迎大家閱讀分享借鑒,希望對大家能夠有所幫助。

c語言讀后感篇一

轉(zhuǎn)載▼

標(biāo)簽:

it

c++本身并沒有提供任何多線程機(jī)制,但是在windows下,我們可以調(diào)用sdk win32 api來編寫多線程的程序,下面就此簡單的講一下:

創(chuàng)建線程的函數(shù)

handle createthread(lpsecurity_attributes lpthreadattributes, // sd

size_t dwstacksize,// initial stack size

lpthread_start_routine lpstartaddress,// thread function

lpvoid lpparameter,// thread argument

dword dwcreationflags,// creation option

lpdword lpthreadid// thread identifier);

在這里我們只用到了第三個和第四個參數(shù),第三個參數(shù)傳遞了一個函數(shù)的地址,也是我們要指定的新的線程,第四個參數(shù)是傳給新線程的參數(shù)指針。

eg1:

#include

#include

using namespace std;

dword winapi fun(lpvoid lpparamter)

{

while(1){ cout<<“fun display!”<

}

int main()

{

handle hthread = createthread(null, 0, fun, null, 0, null);

closehandle(hthread);

while(1){ cout<<“main display!”<

return 0;

}

我們可以看到主線程(main函數(shù))和我們自己的線程(fun函數(shù))是隨機(jī)地交替執(zhí)行的,但是兩個線程輸出太快,使我們很難看清楚,我們可以使用函數(shù)

void sleep(dword dwmilliseconds// sleep time);

來暫停線程的執(zhí)行,dwmilliseconds表示千分之一秒,所以

sleep(1000);

表示暫停1秒

eg2:

#include

#include

using namespace std;

dword winapi fun(lpvoid lpparamter)

{

while(1){ cout<<“fun display!”<

}

int main()

{

handle hthread = createthread(null, 0, fun, null, 0, null);

closehandle(hthread);

while(1){ cout<<“main display!”<

return 0;

}

執(zhí)行上述代碼,這次我們可以清楚地看到在屏幕上交錯地輸出fun display!和main display!,我們發(fā)現(xiàn)這兩個函數(shù)確實是并發(fā)運(yùn)行的,細(xì)心的讀者可能會發(fā)現(xiàn)我們的程序是每當(dāng)fun函數(shù)和main函數(shù)輸出內(nèi)容后就會輸出換行,但是我們看到的確是有的時候程序輸出換行了,有的時候確沒有輸出換行,甚至有的時候是輸出兩個換行。這是怎么回事?下面我們把程序改一下看看:

eg3:

#include

#include

using namespace std;

dword winapi fun(lpvoid lpparamter)

{

while(1){ cout<<“fun display!n”;sleep(1000);}

}

int main()

{

handle hthread = createthread(null, 0, fun, null, 0, null);

closehandle(hthread);

while(1){ cout<<“main display!n”;sleep(2000);}

return 0;

}

我們再次運(yùn)行這個程序,我們發(fā)現(xiàn)這時候正如我們預(yù)期的,正確地輸出了我們想要輸出的內(nèi)容并且格式也是正確的。下面我就來講一下此前我們的程序為什么沒有正確的運(yùn)行。多線程的程序時并發(fā)地運(yùn)行的,多個線程之間如果公用了一些資源的話,我們并不能保證這些資源都能正確地被利用,因為這個時候資源并不是獨占的,舉個例子吧:

eg4:

加入有一個資源 int a = 3

有一個線程函數(shù) selfadd()該函數(shù)是使 a += a;

又有一個線程函數(shù) selfsub()該函數(shù)是使a-= a;

我們假設(shè)上面兩個線程正在并發(fā)欲行,如果selfadd在執(zhí)行的時候,我們的目的是想讓a編程6,但此時selfsub得到了運(yùn)行的機(jī)會,所以a變成了0,等到selfadd的到執(zhí)行的機(jī)會后,a += a,但是此時a確是0,并沒有如我們所預(yù)期的那樣的到6,我們回到前面eg2,在這里,我們可以把屏幕看成是一個資源,這個資源被兩個線程所共用,加入當(dāng)fun函數(shù)輸出了fun display!后,將要輸出endl(也就是清空緩沖區(qū)并換行,在這里我們可以不用理

解什么事緩沖區(qū)),但此時main函數(shù)確得到了運(yùn)行的機(jī)會,此時fun函數(shù)還沒有來得及輸出換行就把cpu讓給了main函數(shù),而這時main函數(shù)就直接在fun display!后輸出main display!,至于為什么有的時候程序會連續(xù)輸出兩個換行,讀者可以采用同樣的分析方法來分析,在這里我就不多講了,留給讀者自己思考了。

那么為什么我們把eg2改成eg3就可以正確的運(yùn)行呢?原因在于,多個線程雖然是并發(fā)運(yùn)行的,但是有一些操作是必須一氣呵成的,不允許打斷的,所以我們看到eg2和eg3的運(yùn)行結(jié)果是不一樣的。

那么,是不是eg2的代碼我們就不可以讓它正確的運(yùn)行呢?答案當(dāng)然是否,下面我就來講一下怎樣才能讓eg2的代碼可以正確運(yùn)行。這涉及到多線程的同步問題。對于一個資源被多個線程共用會導(dǎo)致程序的混亂,我們的解決方法是只允許一個線程擁有對共享資源的獨占,這樣就能夠解決上面的問題了。

handle createmutex(lpsecurity_attributes lpmutexattributes,// sd

bool binitialowner,// initial owner

lpctstr lpname// object name);

該函數(shù)用于創(chuàng)造一個獨占資源,第一個參數(shù)我們沒有使用,可以設(shè)為null,第二個參數(shù)指定該資源初始是否歸屬創(chuàng)建它的進(jìn)程,第三個參數(shù)指定資源的名稱。

handle hmutex = createmutex(null,true,“screen”);

這條語句創(chuàng)造了一個名為screen并且歸屬于創(chuàng)建它的進(jìn)程的資源

bool releasemutex(handle hmutex// handle to mutex);

該函數(shù)用于釋放一個獨占資源,進(jìn)程一旦釋放該資源,該資源就不再屬于它了,如果還要用到,需要重新申請得到該資源。申請資源的函數(shù)如下

dword waitforsingleobject(handle hhandle,// handle to object

dword dwmilliseconds// time-out interval);

第一個參數(shù)指定所申請的資源的句柄,第二個參數(shù)一般指定為infinite,表示如果沒有申請到資源就一直等待該資源,如果指定為0,表示一旦得不到資源就返回,也可以具體地指定等待多久才返回,單位是千分之一秒。好了,該到我們來解決eg2的問題的時候了,我們可以把eg2做一些修改,如下

eg5:

#include

#include

using namespace std;

handle hmutex;

dword winapi fun(lpvoid lpparamter)

{

while(1){

waitforsingleobject(hmutex, infinite);

cout<<“fun display!”<

sleep(1000);

releasemutex(hmutex);

}

}

int main()

{

handle hthread = createthread(null, 0, fun, null, 0, null);hmutex = createmutex(null, false, “screen”);

closehandle(hthread);

while(1){

waitforsingleobject(hmutex, infinite);

cout<<“main display!”<

sleep(2000);

releasemutex(hmutex);

}

return 0;

}

運(yùn)行代碼正如我們所預(yù)期的輸出的內(nèi)容。

c語言讀后感篇二

1.數(shù)組

1.1數(shù)組定義時的注意點

1在c++中不提供可變化大小的數(shù)組,○即數(shù)組定義中的常量表達(dá)式不能包含變量。(來源:c++書6.1.1)

int n;cin>>n;float t[n];上例在定義數(shù)組t時,變量n沒有確定的值,即在程序執(zhí)行之前,無法知道數(shù)組t的元素個數(shù),所以這種聲明不被允許。但是可以用new動態(tài)分配,如: int n;cin>>n;float *t;t=new float[n];

2在定義數(shù)組時,可以不直接指定數(shù)組的大小,由c++編譯器根據(jù)初值表中元素的個數(shù)來自○動確定數(shù)組元素的個數(shù)。例如: int z[]={0,1,2,3,4,5,6,7,8} 3c++語言規(guī)定只能對數(shù)組中的元素進(jìn)行賦值或引用,不能把整個數(shù)組作為一個整體進(jìn)行賦○值或引用。(2.3是一個實例)(來源:c++書4同類型的數(shù)組之間不能相互賦值 ○如int a[5],b[5];a=b;//錯誤

strcpy(b,a);//正確

6.1.1)

1.2數(shù)組和指針的關(guān)系(來源:c++書8.2節(jié)8.2.1)

char s[5];在c++中說明了一個數(shù)組后,數(shù)組名可以作為一個指針來使用,因此s可作為一個指針使用(但它不同于指針,不能賦值運(yùn)算、算術(shù)運(yùn)算等)。

2.字符數(shù)組

2.1輸入字符數(shù)據(jù) char c;cin>>c;// cin不能將輸入的空格賦給字符型變量。

();//可獲得鍵盤上輸入的每一個字符,包括空格和回車鍵。

2.2字符數(shù)組的輸入/輸出(來源:c++書6.2.4)2.2.1逐個字符輸入 char c[10];for(int i=0;i<10;i++)cin>>c[i];2.2.2字符串輸入 方法1 char c[10];cin>>c;//即在輸入輸出時只給數(shù)組名

此法在輸入字符串時,遇到空格和回車就認(rèn)為一個字符結(jié)束。方法2 e(字符數(shù)組名,允許輸入的最大字符個數(shù))此法可把輸入的一行作為一個字符串送到字符數(shù)組中。

2.3字符數(shù)組和字符指針的初始化 2.3.1字符數(shù)組初始化 char tx[5]=“";2.3.2字符指針初始化 char *ptx=new char[5];ptx[0]='';2.4字符串賦值

方法1 char tx[4]=”abcd“;方法2 char tx[4];//tx=”abcd“;//錯誤,tx是數(shù)組名,不分配內(nèi)存空間,不可以進(jìn)行賦值操作;但是數(shù)組名可當(dāng)指針使用(c++書8.2.1)。strcpy(tx,”abcd“);以上兩種方法是數(shù)組

方法3是指向數(shù)組的指針方法 方法3 char *tx;tx=new char[4];tx=”abcd“ 方法4 char *tx=”abcde“;//這相當(dāng)于根據(jù)數(shù)組元素的個數(shù),確定數(shù)組的大小。tx指針指向這個數(shù)組。

//下面實例告訴我們,不僅字符數(shù)組與字符指針有區(qū)別,用new給定內(nèi)存空間大小的字符指針與沒給定內(nèi)存空間大小的字符指針也是有區(qū)別的 voidmain(){

/*char s[6]=”“;

strcpy(s,”abcd“);cout<

/*char *s=new char[5];strcpy(s,”abcd“);

} cout<

char *s=”“;//分配了內(nèi)存空間,但不知道大小 strcpy(s,”abcd“);//錯誤,使用時要注意??!cout<

3.指針

3.1指針可執(zhí)行的運(yùn)算

指針可以進(jìn)行賦值運(yùn)算、算術(shù)運(yùn)算、關(guān)系運(yùn)算。

1可以將與指針變量同類型的任一變量的地址賦給指針○2在c++中,可以(1)賦值運(yùn)算:○

3同類型的指針變量之間可以將0賦給任一指針變量,其含義是初始化指針變量,使其為空○相互賦值,不同類型的經(jīng)強(qiáng)制轉(zhuǎn)換后也可以,通常也沒意義。(2)算術(shù)運(yùn)算:指針變量執(zhí)行“++”或“——”,其含義是使指針變量指向下一個或上一個元素

3.2指針和數(shù)組(同1.2)3.3指向數(shù)組的指針變量

char(*p)[10];(*p)指明p是一個指針變量,再與[10]結(jié)合,表示該指針變量所指向的數(shù)據(jù)是一個一維數(shù)組,該數(shù)組由10個元素組成。3.4指針數(shù)組

由若干個同類型的指針?biāo)M成的數(shù)組稱為指針數(shù)組,數(shù)組的每個元素都是一個指針變量。定義指針數(shù)組的格式:如char *p[10];由于“[]”的優(yōu)先級比“*”高,p[10]構(gòu)成一個數(shù)組,再與“*”結(jié)合,指明是一個指針數(shù)組。3.5指向指針的指針變量 char **pp;3.6 new運(yùn)算符

注意點:

用new運(yùn)算符分配的內(nèi)存空間的指針值必須保存起來,以便于delete運(yùn)算符歸還已動態(tài)分配的內(nèi)存,否則會出現(xiàn)不可預(yù)測的錯誤。3.6.1指向數(shù)組的指針 char* m_p1;m_p1=new char[10];//指針m_p1指向含有10個元素的數(shù)組空間。for(i=0;i<10;i++)m_p2[i]表示這10個數(shù)組元素。

voidmain(){ char *p1;//char b;p1=newchar[5];

//p1=”abcde“;//直接給p1賦字符串,下面for循環(huán)中是給每個元素賦值。for(inti=0;i<5;i++){ //b='c';

} p1[i]='a';//p1[i]是數(shù)組元素,不是指針

cout<

3.6.2指向指針的指針變量 char**m_p2;//指向指針的指針

m_p2=new char*[10];//指針m_p2指向含有10個元素的指針數(shù)組。for(i=0;i<10;i++)m_p2[i]表示這10個指針。

void main(){ char *p1;char **pp;p1=new char[5];pp=new char*[5];for(int i=0;i<5;i++){

p1[i]='a';=&p1[i];//pp[i]是指針

cout<

cout<

3.7 delete運(yùn)算符

delete釋放的不是指針本身,而是指針?biāo)傅膶ο蟆?/p>

4.容器類std::string #include

#include

int main(int argc, char * argv[]){

std::string str=”abc“;

std::string::iterator cit=();

for(;cit!=null;++cit)//null比較,我估計肯定不對,雖然你說是可以通過編譯

{

std::cout<<*cit<

}

return 0;}

4.容器類vector 4.1迭代器和指針的區(qū)別

有時需要使用指向vector的一個指針,我們可以這樣來做。

vector

v;

表達(dá)式v[0]生產(chǎn)一個指向vector中第一個元素的引用,所以,&v[0]是指向那個首元素的指針。vector中的元素被c++標(biāo)準(zhǔn)限定為存儲在連續(xù)內(nèi)存中,就像是一個數(shù)組。

如果你在一個不好的環(huán)境中,()代替&v[0],因為(這些討厭的家伙將會告訴你)begin返回指向vector內(nèi)部的迭代器,而對于vector,其迭代器實際上是指針。那經(jīng)常是正確的,但正如條款50所說,并不總是如此,你不該依賴于此。

begin的返回類型是iterator,而不是一個指針,當(dāng)你需要一個指向vector內(nèi)部數(shù)據(jù)的指針時絕不該使用begin。(),就應(yīng)該鍵入&*(),因為這將會產(chǎn)生和&v[0]相同的指針。

這表明迭代器的內(nèi)容*()才是vector中第一個元素。

4.2 容器vector的函數(shù)clear()

清空vector里所有的元素。因此,如amprocesslist析構(gòu)函數(shù)里一個個刪除vector中所有的元素是多此一舉。

5.關(guān)鍵字operator 它是說明符,用于重載運(yùn)算符。

6.函數(shù)可以將一個處理的結(jié)果值通過函數(shù)的return語句返回,也可以通過參數(shù)將處理的多個結(jié)果帶給調(diào)用者。

c++語言在處理函數(shù)調(diào)用時,參數(shù)是自右向左依次入棧的

7.類的前置聲明

char* bjarne在他的the c++ programming language里面給出過一個助記的方法: 把一個聲明從右向左讀。

char * constcp;(* 讀成 pointer to)cp is a const pointer to char--->cp是一個指向字符char的固定指針

const char * ptr;ptr is a pointer to const char;--->ptr是一個指向固定字符char的指針

char const * p;--->無此形式 也就是說,cp和ptr都是指針,cp的值是不可改變的cp指向的內(nèi)容是可變的;而ptr的值是可以改變的,ptr指向的內(nèi)容是不可變的

轉(zhuǎn)化為constchar*,const char*轉(zhuǎn)化為char* 1.在string里面string.c_str()函數(shù)把string轉(zhuǎn)換為了const char*.○代碼如下:

stringa=”abcd“;const char*p=a.c_str();2const_cast

將const char*轉(zhuǎn)換為char*.○ char*p=const_cast

(a.c_str());

10.初始化

char *p;char *s=”“;char *t=null;p沒分配內(nèi)存,s分配了內(nèi)存,t為空,11.變量的初始化 1指針需要初始化; ○2基本數(shù)據(jù)類型聲明的變量需要初始化;如double m_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ù)。它是運(yùn)行時的多態(tài)性,即在程序運(yùn)行時,根據(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();}

button newbtn = new button();on = new (128, 110); = ”newbtn“; = new (75, 23); = ”button2";ualstylebackcolor = true;(newbtn);

///清除新生成的btn (newbtn);

cbutton* ctexteditorview::newmybutton(int nid,crect rect,int nstyle){ cstring m_caption;ring(nid);//取按鈕標(biāo)題 cbutton *p_button = new cbutton();assert_valid(p_button);p_button->create(m_caption, ws_child | ws_visible | bs_pushbutton | nstyle, rect, this, nid);//創(chuàng)建按鈕 return p_button;}

c語言讀后感篇三

unit one對象的演化

oop技術(shù)能夠很容易地將大量問題歸納為一個簡單的解,這一發(fā)現(xiàn)產(chǎn)生了大量的oop語言,其中最著名的是smalltalk—c++之前最成功的oop語言。

繼承表示了基本類型和派生類型之間的相似性,程序員創(chuàng)建一個基本類型以描述系統(tǒng)中一些對象的思想核心。由這個基本類型派生出其他類型,表達(dá)了認(rèn)識該核心的不同途徑。

早捆綁意味著編譯器對特定的函數(shù)名產(chǎn)生調(diào)用,而連接器確定調(diào)用執(zhí)行代碼的絕對地址。對于。oop采用動態(tài)綁定。當(dāng)給對象發(fā)送消息時,在程序運(yùn)行之前不去確定被調(diào)用的代碼。編譯器保證這個被調(diào)用的函數(shù)存在,并完成參數(shù)和返回值的類型檢查,但是它不知道將執(zhí)行的準(zhǔn)確代碼。為了實現(xiàn)晚捆綁,編譯器在真正調(diào)用的地方插入一段特殊的二進(jìn)制代碼。通過使用存放在對象自身中的信息,這段代碼在運(yùn)行時計算被調(diào)用函數(shù)的地址。這樣,每個對象就能根據(jù)一個指針的內(nèi)容有不同的行為。當(dāng)一個對象接收到消息時,它根據(jù)這個消息判斷應(yīng)當(dāng)做什么。

程序員可以用關(guān)鍵字v i r t u a l表明他希望某個函數(shù)有晚捆綁的靈活性,而并不需要懂得v i r t u a l的使用機(jī)制。沒有它,就不能用c + +做面向?qū)ο蟮某绦蛟O(shè)計。vi r t u a l函數(shù)(虛函數(shù))表示允許在相同家族中的類有不同的行為。這些不同是引起多態(tài)行為的原因。

用c 語言編寫的過程程序就是一些數(shù)據(jù)定義和函數(shù)調(diào)用。要理解這種程序的含義,程序員必須掌握函數(shù)調(diào)用和函數(shù)實現(xiàn)的本身。這就是過程程序需要中間表示的原因。中間表示容易引起混淆,因為中間表示的表述是原始的,更偏向于計算機(jī),而不偏向于所解決的問題。

通常,面向?qū)ο蟪绦蛐枰^少的代碼,因為問題中的許多部分都可以用已存在的庫代碼。

c+ +成功的原因是經(jīng)濟(jì)上的:轉(zhuǎn)變到o o p需要代價,而轉(zhuǎn)變到c + +所花的代價較小。盡可能地為程序員提供最大便利。

為c + +堵塞了c語言中的一些漏洞,并提供更好的類型檢查和編譯時的分析。程序員必須先說明函數(shù),使編譯器能檢查它們的使用情況。預(yù)處理器虛擬刪除值替換和宏,這就減少了查找疵點的困難。c + +有一個性能,稱為r e f e r e n c e s(引用),它允許對函數(shù)參數(shù)和返回值的地址進(jìn)行更方便的處理。函數(shù)重載改進(jìn)了對名字的處理,使程序員能對不同的函數(shù)使用相同的名字。另外,名字空間也加強(qiáng)了名字的控制。許多性能使c的更安全。面向?qū)ο蟮腸 + +程序的速度與用c寫的程序速度相差在± 1 0 %之內(nèi),而且常常更接近。用o o p方法設(shè)計的程序可能比c的對應(yīng)版本更有效。

c+ +的主要目標(biāo)是讓程序員能更容易地使用庫,這是通過將庫轉(zhuǎn)換為新數(shù)據(jù)類型(類)來完成的。引入一個庫,就是向該語言增加一個新類型。編譯器負(fù)責(zé)這個庫如何使用,保證適當(dāng)?shù)某跏蓟颓宄?,保證函數(shù)被正確地調(diào)用。

? 模板的源代碼重用

一些重要的類型要求修改源代碼以便有效地重用。模板可以自動完成對代碼的修改,因而是重用庫代碼特別有用的工具。用模板設(shè)計的類型很容易與其他類型一起工作。因為模板對程序員隱藏了這類代碼重用的復(fù)雜性,所以特別好用。

c + +的異常處理(見第1 7章的內(nèi)容)保證能檢查到錯誤并進(jìn)行處理。

c語言同樣有這樣的限制,例如當(dāng)程序超過50 000行時,名字沖突就開始成為問題。簡言之,程序員用光了函

數(shù)和變量名。設(shè)計c + +的目的是為了輔助大程序設(shè)計,也就是說,去掉小程序和大程序之間復(fù)雜性的分界。

程序設(shè)計有兩個原則:

1)內(nèi)部原則體現(xiàn)在程序自身的結(jié)構(gòu)中,機(jī)靈而有見解的程序員可以通過程序設(shè)計語言的表達(dá)方式了解這種內(nèi)部原則。

2)外部原則體現(xiàn)在程序的源信息中,一般被描述為“設(shè)計文檔”(不要與產(chǎn)品文檔混淆)。

過程語言:為科學(xué)工作者使用的f o rt r a n(f o r m u l a-t r a n s l a t i o n)和為商業(yè)者使用的c o b o l

(common business-oriented language)。純計算機(jī)科學(xué)中很成功的語言是l i s p(l i s t-p r o c e s s i n g),而面向數(shù)學(xué)的語言應(yīng)當(dāng)是a p l(a programming l a n g u a g e)。

1.3.4 對象設(shè)計的五個階段

1)對象發(fā)現(xiàn)這個階段出現(xiàn)在程序的最初分析期間。可以通過尋找外部因素與界線、系統(tǒng)中的元素副本和最小概念單元而發(fā)現(xiàn)對象。如果已經(jīng)有了一組類庫,某些對象是很明顯的。類之間的共同性(暗示了基類和繼承類),可以立刻出現(xiàn)或在設(shè)計過程的后期出現(xiàn)。

2)對象裝配我們在建立對象時會發(fā)現(xiàn)需要一些新成員,這些新成員在對象發(fā)現(xiàn)時期未出現(xiàn)過。對象的這種內(nèi)部需要可能要用新類去支持它。

3)系統(tǒng)構(gòu)造對對象的更多要求可能出現(xiàn)在以后階段。隨著不斷的學(xué)習(xí),我們會改進(jìn)我們的對象。與系統(tǒng)中其它對象通訊和互相連接的需要,可能改變已有的類或要求新類。

4)系統(tǒng)擴(kuò)充當(dāng)我們向系統(tǒng)增添新的性能時,可能發(fā)現(xiàn)我們先前的設(shè)計不容易支持系統(tǒng)擴(kuò)充。這時,我們可以重新構(gòu)造部分系統(tǒng),并很可能要增加新類。

5)對象重用這是對類的真正的重點測試。如果某些人試圖在全新的情況下重用它,他們會發(fā)現(xiàn)一些缺點。當(dāng)我們修改一個類以適應(yīng)更新的程序時,類的一般原則將變得更清楚,直到我們有了一個真正可重用的對象。

對象開發(fā)原則

1)讓特殊問題生成一個類,然后在解其他問題時讓這個類生長和成熟。

2)記住,發(fā)現(xiàn)所需要的類,是設(shè)計系統(tǒng)的主要內(nèi)容。如果已經(jīng)有了那些類,這個項目就不困難了。

3)不要強(qiáng)迫自己在一開始就知道每一件事情,應(yīng)當(dāng)不斷地學(xué)習(xí)。

4)開始編程,讓一部分能夠運(yùn)行,這樣就可以證明或反駁已生成的設(shè)計。不要害怕過程語言風(fēng)格的細(xì)面條式的代碼—類分割可以控制它們。壞的類不會破壞好的類。

5)盡量保持簡單。具有明顯用途的不太清楚的對象比很復(fù)雜的接口好。我們總能夠從小的和簡單的類開始,當(dāng)我們對它有了較好地理解時再擴(kuò)展這個類接口,但不可能簡化已存在的類接口。

第2章數(shù)據(jù)抽象

庫,簡單地說就是一些人已經(jīng)寫的代碼,按某種方式包裝在一起。通常,最小的包是帶有擴(kuò)展名如l i b的文件和向編譯器聲明庫中有什么的一個或多個頭文件。連接器知道如何在l i b文件中搜索和提取相應(yīng)的已編譯的代碼。但是,這只是提供庫的一種方法。在跨越多種體系結(jié)構(gòu)的平臺上,例如u n i x,通常,提供庫的最明智的方法是用源代碼,這樣在新的目標(biāo)機(jī)上它能被重新編譯。而在微軟wi n d o w s上,動態(tài)連接庫是最明智的方法,這使得我們能夠利用新發(fā)布的d d l經(jīng)常修改我們的程序,我們的庫函數(shù)銷售商可能已經(jīng)將新d d l發(fā)送給我們了。

2.1 聲明與定義

“聲明”向計算機(jī)介紹名字,它說,“這個名字是什么意思”。而“定義”為這個名字分配存儲空間。無論涉及到變量時還是函數(shù)時含義都一樣。無論在哪種情況下,編譯器都在“定義”處分配存儲空間。對于變量,編譯器確定這個變量占多少存儲單元,并在內(nèi)存中產(chǎn)生存放它們的空間。對于函數(shù),編譯器產(chǎn)生代碼,并為之分配存儲空間。函數(shù)的存儲空間中有一個由使用不帶參數(shù)表或帶地址操作符的函數(shù)名產(chǎn)生的指針。定義也可以是聲明。如果該編譯器還沒有看到過名字a,程序員定義int a,則編譯器馬上為這個名字分配存儲地址。聲明常常使用于e x t e r n關(guān)鍵字。如果我們只是聲明變量而不是定義它,則要求使用e x t e r n。對于函數(shù)聲明,e x t e r n是可選的,不帶函數(shù)體的函數(shù)名連同參數(shù)表或返回值,自動地作為一個聲明。

c+ +要求必須寫出函數(shù)原型(的全部信息),因為它增加了一個重要的安全層。

c語言讀后感篇四

c++編程書評

最近一段時間都在看c++編程,想讓自己對計算機(jī)有更多的了解,和更好的運(yùn)用,這也是對自我的一種知識面的一種提升。更多的可能還是出于自己對這方面的熱愛吧。那我就把我讀后對書本的了解,不過大多數(shù)都是書上的一些重點還有一些專業(yè)術(shù)語。主要也是對這本書的大概介紹吧!

用c 語言編寫的過程程序就是一些數(shù)據(jù)定義和函數(shù)調(diào)用。要理解這種程序的含義,程序員必須掌握函數(shù)調(diào)用和函數(shù)實現(xiàn)的本身。這就是過程程序需要中間表示的原因。中間表示容易引起混淆,因為中間表示的表述是原始的,更偏向于計算機(jī),而不偏向于所解決的問題。

通常,面向?qū)ο蟪绦蛐枰^少的代碼,因為問題中的許多部分都可以用已存在的庫代碼。

c+ +成功的原因是經(jīng)濟(jì)上的:轉(zhuǎn)變到o o p需要代價,而轉(zhuǎn)變到c + +所花的代價較小。盡可能地為程序員提供最大便利。

為c + +堵塞了c語言中的一些漏洞,并提供更好的類型檢查和編譯時的分析。程序員必須先說明函數(shù),使編譯器能檢查它們的使用情況。預(yù)處理器虛擬刪除值替換和宏,這就減少了查找疵點的困難。c + +有一個性能,稱為r e f e r e n c e s(引用),它允許對函數(shù)參數(shù)和返回值的地址進(jìn)行更方便的處理。函數(shù)重載改進(jìn)了對名字的處理,使程序員能對不同的函數(shù)使用相同的名字。另外,名字空間也加強(qiáng)了名字的控制。許多性能使c的更安全。面向?qū)ο蟮腸 + +程序的速度與用c寫的程序速度相差在± 1 0 %之內(nèi),而且常常更接近。用o o p方法設(shè)計的程序可能比c的對應(yīng)版本更有效。

c+ +的主要目標(biāo)是讓程序員能更容易地使用庫,這是通過將庫轉(zhuǎn)換為新數(shù)據(jù)類型(類)來完成的。引入一個庫,就是向該語言增加一個新類型。編譯器負(fù)責(zé)這個庫如何使用,保證適當(dāng)?shù)某跏蓟颓宄?,保證函數(shù)被正確地調(diào)用。

模板的源代碼

一些重要的類型要求修改源代碼以便有效地重用。模板可以自動完成對代碼的修改,因而是重用庫代碼特別有用的工具。用模板設(shè)計的類型很容易與其他類型一起工作。因為模板對程序員隱藏了這類代碼重用的復(fù)雜性,所以特別好用。c語言同樣有這樣的限制,例如當(dāng)程序超過50 000行時,名字沖突就開始成為問題。簡言之,程序員用光了函數(shù)和變量名。設(shè)計c + +的目的是為了輔助大程序設(shè)計,也就是說,去掉小程序和大程序之間復(fù)雜性的分界。

程序設(shè)計有兩個原則

1)內(nèi)部原則體現(xiàn)在程序自身的結(jié)構(gòu)中,機(jī)靈而有見解的程序員可以通過程序設(shè)計語言的表達(dá)方式了解這種內(nèi)部原則。

2)外部原則體現(xiàn)在程序的源信息中,一般被描述為“設(shè)計文檔”(不要與產(chǎn)品文檔混淆)。

對象設(shè)計的五個階段

1)對象發(fā)現(xiàn)這個階段出現(xiàn)在程序的最初分析期間??梢酝ㄟ^尋找外部因素與界線、系統(tǒng)中的元素副本和最小概念單元而發(fā)現(xiàn)對象。如果已經(jīng)有了一組類庫,某些對象是很明顯的。類之間的共同性(暗示了基類和繼承類),可以立刻出現(xiàn)或在設(shè)計過程的后期出現(xiàn)。

2)對象裝配我們在建立對象時會發(fā)現(xiàn)需要一些新成員,這些新成員在對象發(fā)現(xiàn)時期未出現(xiàn)過。對象的這種內(nèi)部需要可能要用新類去支持它。

3)系統(tǒng)構(gòu)造對對象的更多要求可能出現(xiàn)在以后階段。隨著不斷的學(xué)習(xí),我們會改進(jìn)我們的對象。與系統(tǒng)中其它對象通訊和互相連接的需要,可能改變已有的類或要求新類。

4)系統(tǒng)擴(kuò)充當(dāng)我們向系統(tǒng)增添新的性能時,可能發(fā)現(xiàn)我們先前的設(shè)計不容易支持系統(tǒng)擴(kuò)充。這時,我們可以重新構(gòu)造部分系統(tǒng),并很可能要增加新類。

5)對象重用這是對類的真正的重點測試。如果某些人試圖在全新的情況下重用它,他們會發(fā)現(xiàn)一些缺點。當(dāng)我們修改一個類以適應(yīng)更新的程序時,類的一般原則將變得更清楚,直到我們有了一個真正可重用的對象。

對象開發(fā)讓特殊問題生成一個類,然后在解其他問題時讓這個類生長和成熟。2 記住,發(fā)現(xiàn)所需要的類,是設(shè)計系統(tǒng)的主要內(nèi)容。如果已經(jīng)有了那些類,這個項目就不困難了。不要強(qiáng)迫自己在一開始就知道每一件事情,應(yīng)當(dāng)不斷地學(xué)習(xí)。

4開始編程,讓一部分能夠運(yùn)行,這樣就可以證明或反駁已生成的設(shè)計。不要害怕過程語言風(fēng)格的細(xì)面條式的代碼—類分割可以控制它們。壞的類不會破壞好的類。盡量保持簡單。具有明顯用途的不太清楚的對象比很復(fù)雜的接口好。我們總能夠從小的和簡單的類開始,當(dāng)我們對它有了較好地理解時再擴(kuò)展這個類接口,但不可能簡化已存在的類接口。

簡單地說就是一些人已經(jīng)寫的代碼,按某種方式包裝在一起。通常,最小的包是帶有擴(kuò)展名如l i b的文件和向編譯器聲明庫中有什么的一個或多個頭文件。連接器知道如何在l i b文件中搜索和提取相應(yīng)的已編譯的代碼。但是,這只是提供庫的一種方法。在跨越多種體系結(jié)構(gòu)的平臺上,例如u n i x,通常,提供庫的最明智的方法是用源代碼,這樣在新的目標(biāo)機(jī)上它能被重新編譯。而在微軟wi n d o w s上,動態(tài)連接庫是最明智的方法,這使得我們能夠利用新發(fā)布的d d l經(jīng)常修改我們的程序。

聲明與定義

“聲明”向計算機(jī)介紹名字,它說,“這個名字是什么意思”。而“定義”為這個名字分配存儲空間。無論涉及到變量時還是函數(shù)時含義都一樣。無論在哪種情況下,編譯器都在“定義”處分配存儲空間。對于變量,編譯器確定這個變量占多少存儲單元,并在內(nèi)存中產(chǎn)生存放它們的空間。對于函數(shù),編譯器產(chǎn)生代碼,并為之分配存儲空間。函數(shù)的存儲空間中有一個由使用不帶參數(shù)表或帶地址操作符的函數(shù)名產(chǎn)生的指針。定義也可以是聲明。如果該編譯器還沒有看到過名字a,程序員定義int a,則編譯器馬上為這個名字分配存儲地址。聲明常常使用于e x t e r n關(guān)鍵字。如果我們只是聲明變量而不是定義它,則要求使用e x t e r n。對于函數(shù)聲明,e x t e r n是可選的,不帶函數(shù)體的函數(shù)名連同參數(shù)表或返回值,自動地作為一個聲明。

或許你看過后或許懂了一點,也對編程有了初步的了解,希望我的書評對你能有所幫助!

【本文地址:http://aiweibaby.com/zuowen/1082488.html】

全文閱讀已結(jié)束,如果需要下載本文請點擊

下載此文檔