第一篇:C++ 面試題(服務器編程、網(wǎng)絡編程方便)
C++ 面試題-專注于服務器編程、網(wǎng)絡編程 C++ 面試題
1.類成員指針
Class test
{
Public:
Int fun(int)const;
Int fun(int);
Static int fun(int);
Int iTemp;
}
1.1非靜態(tài)成員函數(shù)指針定義:
int(Test::*pFun)(int)= &Test::fun;
int(Test::*pFunConst)(int)const = &Test::fun;
使用:
Test a;
const Test b;
(a.*pFun)(2)或(a.*pFunConst)(2);
(b.*pFunConst)(2);
不能用(b.*pFun)(2);
1.2非靜態(tài)成員變量int Test::*pInt = &Test::iTemp;
(a.*pInt)= 3;
1.3靜態(tài)成員函數(shù)指針int(*pFun)()= &Test::fun;
或 int(*pFun)()= Test::fun;都正確;(注:定義無域操作符)使用:
(*pFun)()或 pFun()都正確;
2.非成員函數(shù)指針和靜態(tài)成員函數(shù)一致。
3.非成員函數(shù)和靜態(tài)成員函數(shù)上不允許修飾符。例如 void fun()const;void fun()volatile;但非靜態(tài) 成員函數(shù)允許const、volatile等修飾符。
4.變量修飾符
auto:指定數(shù)據(jù)存儲在棧中。局部變量默認為auto。該修飾符不能用于成員變量和全局變量。
static: 局部變量表示存儲在靜態(tài)空間,全局變量表示不允許外部引用。
volatile:表示該變量可能隨時改變,不要做任何假設優(yōu)化。
mutale: 去除成員變量的const屬性。
extern:全局變量默認為extern屬性,表示可被外部引用,此時與static相對。
extern int a =2;表示定義一個可被外部引用的變量。
extern int a;表示引用外部變量。
5.數(shù)據(jù)類型隱式轉(zhuǎn)換
短數(shù)據(jù)->長數(shù)據(jù)(eg: float-> double)
有符號->無符號(eg: int-> unsigned int)PS: 所以 int(-1)>unsigned int(1);
低精度->高精度(eg: int-> float)
6.memcpy 有“防重疊”覆蓋機制,strcpy 沒有。
7.float表示
共計32位,折合4字節(jié)
由最高到最低位分別是第31、30、29、……、0位
31位是 符號位,1表示該數(shù)為負,0反之。
30-23位,一共8位是指數(shù)位。
22-0位,一共23位是尾數(shù)位。
每 8位分為一組,分成4組,分別是A組、B組、C組、D組。
每一組是一個字節(jié),在內(nèi)存中逆序存儲,即:DCBA
8.不能在類的聲明中初始化類常量,而只能在構(gòu)造函數(shù)初始化列表來初始化
9.類中的枚舉常量不占用對象的存儲空間
10.有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈式表達,可以附加返回值。
11.賦值函數(shù),應當用“引用傳遞”的方式返回String 對象。如果用“值傳遞”的方式,雖然功能仍然正確,但由于return 語句要把 *this 拷貝到保存返回值的外部存儲單元之中,增加了不必要的開銷,降低了賦值函數(shù)的效率。
12.對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free 無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。如果用free 釋放“new 創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導致程序出錯。如果用delete 釋放“malloc 申請的動態(tài)內(nèi)存”,理論上講程序不會出錯,但是該程序的可讀性很差。
13.如果用new 創(chuàng)建對象數(shù)組,那么只能使用對象的無參數(shù)構(gòu)造函數(shù),delete時如果對象沒有析構(gòu)函數(shù),則delete和delete[]是功能相同的。
14.只能靠參數(shù)而不能靠返回值類型的不同來區(qū)分重載函數(shù)。編譯器根據(jù)參數(shù)為每個重載函數(shù)產(chǎn)生不同的內(nèi)部標識符。并不是兩個函數(shù)的名字相同就能構(gòu)成重載。全局函 數(shù)和類的成員函數(shù)同名不算重載,因為函數(shù)的作用域不同。
15.關(guān)鍵字inline
必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline 放在函數(shù)聲明前面不起任何作用。定義在類聲明之中的成員函數(shù)將自動地成為內(nèi)聯(lián)函數(shù)。
以下情況不宜使用內(nèi)聯(lián):
(1)如果函數(shù)體內(nèi)的代碼比較長,使用內(nèi)聯(lián)將導致內(nèi)存消耗代價較高。
(2)如果函數(shù)體 內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)體內(nèi)代碼的時間要比函數(shù)調(diào)用的開銷大。
16.只有靜態(tài)常量整型數(shù)據(jù)成員才可以在類中初始化,普通成員只能在初始化列表或函數(shù)內(nèi)初始化,常量成員只能在初始化列表。成員對象初始化的次序完全不受它們在 初始化表中次序的影響,只由成員對象在類中聲明的次序決定。
17.拷貝構(gòu)造函數(shù)和賦值函數(shù)非常容易混淆,常導致錯寫、錯用。拷貝構(gòu)造函數(shù)是在對象被創(chuàng)建時調(diào)用的,而賦值函數(shù)只能被已經(jīng)存在了的對象調(diào)用。
18.不想編寫拷貝構(gòu)造函數(shù)和賦值函數(shù),又不允許別人使用編譯器生成的,則只需將拷貝構(gòu)造函數(shù)和賦值函數(shù)聲明為私有函數(shù),不用編寫代碼。
19.“const T”和“T const”總是都被允許的,而且是等效的。
注意在常量指針(const pointer)中,“const”永遠出現(xiàn)在“*”之后。
例如:
int *const p1 = q;//指向int 變量的常量指針
int const* p2 = q;//指向int 常量的指針
const int* p3 = q;//指向int 常量的指針
20.一個常見的微妙問題是,一個函數(shù)風格的宏并不遵守函數(shù)參數(shù)傳遞的規(guī)則。
21.沒有引用數(shù)組,但可有指向數(shù)組的引用,并且保留數(shù)組的邊界。
22.左值擁有保存值的位置,而右值則沒有相關(guān)地址,只是簡單值。
23.負索引是可以的,如p[-2]或(-2)[p]都是可以的(p必然不能是數(shù)組名),但必須保持不越界。
sum=p()+q()+r();不能保證p(),q(),r()調(diào)用的順序。
逗號運算符“,”可以保證求值順序.result=(p(),q(),r());是先求p(),q(),然后將r()賦給result
24.在if的條件里聲明變量,且可在真假分支里面使用。
const int * const * p;p是個指針,指向常指針的,常指針指向一個常量int。
25.不能用空白初始化列表來規(guī)定默認的對象初始化.class a;
a A();//會警告,看起來像函數(shù)聲明
a *p=new a();//ok
a *p=new a;//ok
26.可以寫一句只有數(shù)字的代碼,如1234;(void)0;可以編譯執(zhí)行,相當于nop。
27.給函數(shù)指針賦值時可以對函數(shù)名取地址也可以不取,通過函數(shù)指針調(diào)用函數(shù)時可以用*也可不用。
28.static_cast可以轉(zhuǎn)換基本數(shù)據(jù)類型(int->char)、void*和有類型指針、基類和派生類指針的轉(zhuǎn)換(多重繼承也行,它可重新計算偏移地址),但是不能轉(zhuǎn)換如(int*->char*等)。
29.dynamic_cast主要用于執(zhí)行“安全的向下轉(zhuǎn)型”,reinterpret_cast可執(zhí)行任何轉(zhuǎn)換,const_cast執(zhí)行去 const轉(zhuǎn)換。
30.將取地址運算符用到完全限定的類成員名(包括變量和函數(shù)),就能獲得指向成員的地址。使用形式為“X::*”來聲明一個指向類X成員的指針。注意聲明成員 函數(shù)指針的時候不能像普通函數(shù)指針可以省略&或*的使用,但靜態(tài)成員函數(shù)則除外,它和普通函數(shù)一致。成員指針和普通指針不一樣,并非指向一個內(nèi)存 區(qū)域,而是相當于一個結(jié)構(gòu)的偏移量,當它和具體的對象結(jié)合就能指向特定對象的特定成員。
31.當把派生類對象賦給基類對象的時候會產(chǎn)生切割現(xiàn)象,即針對派生類的數(shù)據(jù)和行為將產(chǎn)生切割。
32.多維數(shù)組的第1個元素是數(shù)組而非普通類型。
33.在含有單參數(shù)構(gòu)造函數(shù)的類中注意隱式轉(zhuǎn)換。如String s=“Hello”;
34.函數(shù)對象是重載函數(shù)調(diào)用運算符的類對象。
35.引用需要用左值進行初始化,但指向常量的引用除外,編譯器將創(chuàng)建一個臨時左值。如const int c=12;//ok 一般情況下編譯器產(chǎn)生的臨時對象的生命期在它所在的最大表達式范圍內(nèi),但用臨時對象初始化常量對象的引用時會讓編譯器保證臨時對象和引用生命周期一樣。
36.可以將基類的成員指針(變量或函數(shù))安全的轉(zhuǎn)換為指向派生類成員的指針,但反之則不安全。
37.函數(shù)參數(shù)的傳遞是采用拷貝構(gòu)造函數(shù)而非賦值操作。對未初始化的對象賦值可能會出現(xiàn)意外,如類中含有未初始化指針。
38.聲明但不定義私有的拷貝構(gòu)造和賦值運算將會關(guān)閉類的復制操作。并且賦值運算、拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù)不會被繼承,對派生類重載賦值運算時需要調(diào)用基類的賦 值運算。
39.在構(gòu)造函數(shù)里對成員變量初始化,比較好的方式是使用初始化列表。在初始化列表中靜態(tài)成員和數(shù)組不能被初始化。
類的初始化順序是虛擬基類的成員->非虛基類成員->類自身成員,和初始化列表的順序無關(guān)。含有虛擬基類和不含的類在成員布局上不一樣,含有虛擬基類的類將虛擬基類的數(shù)據(jù)放在最后面。另外如B:virtual A,C:virtual A,D:B,C;(均是虛繼承)則D的構(gòu)造函數(shù)將對A初始化一次(即使在初始化列表沒有顯式初始化A),B,C將不再對A初始化。
所有靜態(tài)數(shù)據(jù)(全局變量和靜態(tài)存儲變量)在使用前如未初始化其值都為0.全局變量可以存儲在靜態(tài)初始化區(qū)和未初始化區(qū)。
40.RVO返回值優(yōu)化,是指在函數(shù)返回中執(zhí)行拷貝初始化到直接初始化(使用帶非對象參數(shù)的構(gòu)造函數(shù))的轉(zhuǎn)換,NRV和RVO類似,但使用命名局部變量來保存返 回值。p160
41.重載、覆蓋和隱藏的區(qū)別
重載的特征:在同一個類,函數(shù)名相同,參數(shù)不同,virtual可有可無。
覆蓋的特征:在兩個類(基類和派生類),函數(shù)名和參數(shù)都相同,且必須有virtual關(guān)鍵字。
隱藏的特征:基類函數(shù)名和派生類函數(shù)名相同參數(shù)不同,且不管是否有關(guān)鍵字?;蚝瘮?shù)名、參數(shù)均相同,但基類 函數(shù)沒有virtual(有的話就是覆蓋)。
不能覆蓋而只能隱藏基類非虛函數(shù)。
42.相同類型的所有對象公用一個虛函數(shù)表,在單繼承下不管有多少個虛函數(shù)都只有一個虛函數(shù)表指針。覆蓋就是在為派生類構(gòu)造虛函數(shù)表時用派生類的函數(shù)地址替換基 類成員函數(shù)地址的過程。
43.使用常量類成員可能在對類對象賦值的時候產(chǎn)生問題。
44.有時候我們可能會看到 if(NULL == p)這樣古怪的格式。不是程序?qū)戝e了,是程序員為了防止將 if(p == NULL)誤寫成 if(p = NULL),而有意把p 和NULL 顛倒。
第二篇:C++編程心得
緊張忙碌的一周過去了,在這個星期里我們小組勝利地將我們選定的課題研究出來,我為我的小組驕傲,也為自己驕傲。
我們的題目是銀行定期存款管理系統(tǒng),在編程過程中,我預訂的任務是學習并掌握MFC,并將其運用到我們的程序中。學習MFC的過程是我認為非常痛苦的事,因為完全都是自學,并且因為圖書館中的相關(guān)書籍全部被借閱出去,所以沒有太多的自學資料,因此雖然費了很大的精力,但仍是無果。經(jīng)過了很多的小組討論和自己的心理斗爭后最終決定放棄MFC而將自己能力以內(nèi)的程序盡可能地優(yōu)化,就這樣,我開始在半路階段加入了程序優(yōu)化的工作,一遍遍的調(diào)試程序,遇到某個攻堅問題,幾個人一起在網(wǎng)上查詢,一起想解決的辦法,就這樣,我們團結(jié)地將我們現(xiàn)在認為將近完美的程序呈現(xiàn)給老師和同學。
一開始學習MFC時,我總是不能很好的轉(zhuǎn)換思維,不能將自己以前的編程思想和以前的一些不良編程習慣甩掉,因此很多的程序都聯(lián)系不起來,反而是自己學會了好多的零碎的片面卻無法將程序大樓豎起來。在困惑很久后,我選擇了詢問老師,老師耐心地將MFC的思維方式講給了我聽,這讓我受益匪淺,雖然我最后沒能將MFC成功的做出來,但我認為我從MFC中才直接地感受到了C++中面向?qū)ο缶幊痰姆庋b性。以前用C++編程時總是將類中的變量隨便規(guī)定屬性,甚至在編程的過程中突然需要加一個變量,為了省事直接將其放于public中,在學習了解MFC后,深刻地感受到自己以前的編程習慣是多么的不科學,而那些習慣又是多么的重要。
我們這一次是以團隊的形式來做這個項目,并且作為這個小組的組長,我感覺自己的壓力很大,因為團隊合作不僅講求整體的團結(jié)而且為了團隊工作的高效又要有明確的分工。在我們的小組工作中每個人都一刻不放松自己手里的工作,而一些時候我們又配合地很密切,尤其是當我們遇到程序的瓶頸時,我們都是在宿舍里你一句我一句地出謀劃策,在遇到一個提取時間的程序時,大家紛紛查詢各種輔導書,上網(wǎng)查各種資料,在遇到定期存款支取問題時甚至打電話給家長,尋求“場外支持”,種種的配合都給我們這個部門協(xié)調(diào)的運作提供了動力。我感謝我的團隊,他們讓我有一種很舒服的做事情的感覺。
最終決定放棄MFC,我承認自己有一種如釋重負的感覺,但是也有一絲慚愧,無論老師要求與否,既然自己決定了就應該走下去,但是我最后退卻了,感覺很遺憾也很羞愧,因為我認為對自己降低要求就是放縱自己墮落。
短學期實習,我著實收獲了很多,不僅僅是知識上,而且是思考事情方法,我感激這次的實習,也感謝給予我們很多幫助的老師,更感謝我團結(jié)的團隊。
第三篇:C++編程思想讀后感
Unit One對象的演化
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ù)這個消息判斷應當做什么。
程序員可以用關(guān)鍵字v i r t u a l表明他希望某個函數(shù)有晚捆綁的靈活性,而并不需要懂得v i r t u a l的使用機制。沒有它,就不能用C + +做面向?qū)ο蟮某绦蛟O計。Vi r t u a l函數(shù)(虛函數(shù))表示允許在相同家族中的類有不同的行為。這些不同是引起多態(tài)行為的原因。
用C 語言編寫的過程程序就是一些數(shù)據(jù)定義和函數(shù)調(diào)用。要理解這種程序的含義,程序員必須掌握函數(shù)調(diào)用和函數(shù)實現(xiàn)的本身。這就是過程程序需要中間表示的原因。中間表示容易引起混淆,因為中間表示的表述是原始的,更偏向于計算機,而不偏向于所解決的問題。
通常,面向?qū)ο蟪绦蛐枰^少的代碼,因為問題中的許多部分都可以用已存在的庫代碼。
C+ +成功的原因是經(jīng)濟上的:轉(zhuǎn)變到O O P需要代價,而轉(zhuǎn)變到C + +所花的代價較小。盡可能地為程序員提供最大便利。
為C + +堵塞了C語言中的一些漏洞,并提供更好的類型檢查和編譯時的分析。程序員必須先說明函數(shù),使編譯器能檢查它們的使用情況。預處理器虛擬刪除值替換和宏,這就減少了查找疵點的困難。C + +有一個性能,稱為r e f e r e n c e s(引用),它允許對函數(shù)參數(shù)和返回值的地址進行更方便的處理。函數(shù)重載改進了對名字的處理,使程序員能對不同的函數(shù)使用相同的名字。另外,名字空間也加強了名字的控制。許多性能使C的更安全。面向?qū)ο蟮腃 + +程序的速度與用C寫的程序速度相差在± 1 0 %之內(nèi),而且常常更接近。用O O P方法設計的程序可能比C的對應版本更有效。
c+ +的主要目標是讓程序員能更容易地使用庫,這是通過將庫轉(zhuǎn)換為新數(shù)據(jù)類型(類)來完成的。引入一個庫,就是向該語言增加一個新類型。編譯器負責這個庫如何使用,保證適當?shù)某跏蓟颓宄?,保證函數(shù)被正確地調(diào)用。
? 模板的源代碼重用
一些重要的類型要求修改源代碼以便有效地重用。模板可以自動完成對代碼的修改,因而是重用庫代碼特別有用的工具。用模板設計的類型很容易與其他類型一起工作。因為模板對程序員隱藏了這類代碼重用的復雜性,所以特別好用。
C + +的異常處理(見第1 7章的內(nèi)容)保證能檢查到錯誤并進行處理。
C語言同樣有這樣的限制,例如當程序超過50 000行時,名字沖突就開始成為問題。簡言之,程序員用光了函
數(shù)和變量名。設計C + +的目的是為了輔助大程序設計,也就是說,去掉小程序和大程序之間復雜性的分界。
程序設計有兩個原則:
1)內(nèi)部原則體現(xiàn)在程序自身的結(jié)構(gòu)中,機靈而有見解的程序員可以通過程序設計語言的表達方式了解這種內(nèi)部原則。
2)外部原則體現(xiàn)在程序的源信息中,一般被描述為“設計文檔”(不要與產(chǎn)品文檔混淆)。
過程語言:為科學工作者使用的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)。純計算機科學中很成功的語言是L i s p(L i s t-P r o c e s s i n g),而面向數(shù)學的語言應當是A P L(A Programming L a n g u a g e)。
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)對象重用這是對類的真正的重點測試。如果某些人試圖在全新的情況下重用它,他們會發(fā)現(xiàn)一些缺點。當我們修改一個類以適應更新的程序時,類的一般原則將變得更清楚,直到我們有了一個真正可重用的對象。
對象開發(fā)原則
1)讓特殊問題生成一個類,然后在解其他問題時讓這個類生長和成熟。
2)記住,發(fā)現(xiàn)所需要的類,是設計系統(tǒng)的主要內(nèi)容。如果已經(jīng)有了那些類,這個項目就不困難了。
3)不要強迫自己在一開始就知道每一件事情,應當不斷地學習。
4)開始編程,讓一部分能夠運行,這樣就可以證明或反駁已生成的設計。不要害怕過程語言風格的細面條式的代碼—類分割可以控制它們。壞的類不會破壞好的類。
5)盡量保持簡單。具有明顯用途的不太清楚的對象比很復雜的接口好。我們總能夠從小的和簡單的類開始,當我們對它有了較好地理解時再擴展這個類接口,但不可能簡化已存在的類接口。
第2章數(shù)據(jù)抽象
庫,簡單地說就是一些人已經(jīng)寫的代碼,按某種方式包裝在一起。通常,最小的包是帶有擴展名如L I B的文件和向編譯器聲明庫中有什么的一個或多個頭文件。連接器知道如何在L I B文件中搜索和提取相應的已編譯的代碼。但是,這只是提供庫的一種方法。在跨越多種體系結(jié)構(gòu)的平臺上,例如U N I X,通常,提供庫的最明智的方法是用源代碼,這樣在新的目標機上它能被重新編譯。而在微軟Wi n d o w s上,動態(tài)連接庫是最明智的方法,這使得我們能夠利用新發(fā)布的D D L經(jīng)常修改我們的程序,我們的庫函數(shù)銷售商可能已經(jīng)將新D D L發(fā)送給我們了。
2.1 聲明與定義
“聲明”向計算機介紹名字,它說,“這個名字是什么意思”。而“定義”為這個名字分配存儲空間。無論涉及到變量時還是函數(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++編程知識總結(jié)
1.數(shù)組
1.1數(shù)組定義時的注意點
1在C++中不提供可變化大小的數(shù)組,○即數(shù)組定義中的常量表達式不能包含變量。(來源: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ù)組中的元素進行賦值或引用,不能把整個數(shù)組作為一個整體進行賦○值或引用。(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可作為一個指針使用(但它不同于指針,不能賦值運算、算術(shù)運算等)。
2.字符數(shù)組
2.1輸入字符數(shù)據(jù) char c;cin>>c;// cin不能將輸入的空格賦給字符型變量。
cin.get();//可獲得鍵盤上輸入的每一個字符,包括空格和回車鍵。
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ù)組名
此法在輸入字符串時,遇到空格和回車就認為一個字符結(jié)束。方法2 cin.getline(字符數(shù)組名,允許輸入的最大字符個數(shù))此法可把輸入的一行作為一個字符串送到字符數(shù)組中。
2.3字符數(shù)組和字符指針的初始化 2.3.1字符數(shù)組初始化 char tx[5]=“";2.3.2字符指針初始化 char *ptx=new char[5];ptx[0]='