1. 以下程序經(jīng)編譯連接生成可執(zhí)行文件?tt.exe,若運(yùn)行以下命令行?tt 12 345 678,?則程序的輸出結(jié)果是()
int main(int argc, char ** argv)
{ int n = 0,i;
for(i=1;i<argc;i++)
? n = n*10+*argv[i]-'0';
print(‘“%n”,n)
return 0;
}
解析:本題考查main函數(shù)默認(rèn)參數(shù)argc和argv的意義 main函數(shù)的第一個(gè)參數(shù)argc為整型參數(shù)致讥,記下從命令行輸入?yún)?shù)的個(gè)數(shù);第二個(gè)參數(shù)argv是一個(gè)字符型的指針數(shù)組舆瘪,它的每一個(gè)元素分別指向命令行輸入的各字符串。在本例中argc的值為4,argv[0]指向字符串“tt”瘪吏,argv[1]指向字符串“12”卓研,argv[2]指向字符串“345”趴俘, argv[3]指向字符串“678”睹簇。程序中,通過(guò)一個(gè)for循環(huán)寥闪,遍歷了后面的三個(gè)參數(shù)字符串太惠,每次將n自乘10,然后累加argv[i]-‘0’疲憋,即 第i個(gè)參數(shù)字符串的首字符減去‘0’凿渊。? 一個(gè)數(shù)字字符減去‘0’字符,即可得到這個(gè)數(shù)字字符的實(shí)際數(shù)值柜某,因此三次循環(huán)之后n的值為136嗽元。
2.C++ 指針常量、常量指針和常指針常量
1喂击、指針常量
如果在定義指針變量時(shí)候剂癌,指針變量前用const修飾,被定義的指針變量就變成了一個(gè)指針類(lèi)型的常變量翰绊,指針類(lèi)型的常變量簡(jiǎn)稱(chēng)為指針常量佩谷。
格式如下
數(shù)據(jù)類(lèi)型? *? const? 指針變量=變量名;
修飾符const與指針變量緊鄰监嗜,說(shuō)明指針變量不允許修改谐檀,既然指針變量的值不能修改,所以一定要在定義的時(shí)候給定初值(指向一個(gè)確定存在的地方)
2裁奇、常量指針
如果在定義指針變量的時(shí)候桐猬,數(shù)據(jù)類(lèi)型前用const修飾,被定義的指針變量就是指向常量的指針變量刽肠,指向常量的指針變量稱(chēng)為常量指針溃肪,格式如下
const 數(shù)據(jù)類(lèi)型? *指針變量=變量名;
或者? ? 數(shù)據(jù)類(lèi)型? const? * 指針變量=變量名音五;
定義一個(gè)常量指針后惫撰,指針指向的值就不能被改變,即不能通過(guò)指針變量直接更改指針指向的值
3躺涝、常指針常量
? ?格式為
? const ? 數(shù)據(jù)類(lèi)型 * const 指針變量=變量名厨钻;
數(shù)據(jù)類(lèi)型 const ?*const 指針變量=變量名;
指針不能改變坚嗜,指針指向的值也不能改變
請(qǐng)聲明一個(gè)指針夯膀,其所指向的內(nèi)存地址不能改變,但內(nèi)存中的值可以被改變苍蔬。
正確答案:B?
A const int const *x = &y;
B int * const x = &y;
C const int *x = &y;
D int const *x = &y;
E const int * const x = &y;
若const限定符在*之前棍郎,則const限定的是*ptr而不限定ptr。也就是說(shuō)银室,ptr可以改變其所指向的對(duì)象涂佃,但不能通過(guò)該指針修改其所指向?qū)ο蟮闹怠?
? 若const限定符在*之后励翼,則const限定的是ptr而不限定*ptr。也就是說(shuō)辜荠,ptr不可以改變其所指向的對(duì)象汽抚,但能通過(guò)該指針修改其所指向?qū)ο蟮闹怠?/p>
? 若在*之前有const限定符且在*之后也有const限定符,則ptr與*ptr都被限定伯病。也就是說(shuō)造烁,ptr既不可以改變其所指向的對(duì)象,也不能通過(guò)該指針修改其所指向?qū)ο蟮闹怠?/p>
另外:只要在*之后有const限定符午笛,則該指針在聲明時(shí)必須初始化
const 的含義是“只讀的”惭蟋,可以采用記錄口訣,“左定值药磺, 右定向”(const位于*左 指向的值不變告组,const位于*右側(cè),指針指向不可改變)
3. 以下字符中不是轉(zhuǎn)義字符的是()癌佩。
正確答案:C??你的答案:D(錯(cuò)誤)
A '\a'
B '\b'
C '\c'
D '\\'
4 多態(tài)虛函數(shù)機(jī)制
#include<iostream>
using namespace std;
class Base
{ public:
??? virtual int foo(int x)
??? {
??? ? ? return x * 10;
??? }
??? int foo(char x[14])
??? {
??? ? ? return sizeof(x) + 10;
??? }
};
class Derived: public Base
{
??? int foo(int x)
??? {
??? ? ? return x * 20;
??? }
??? virtual int foo(char x[10])
??? {
??? ? ? return sizeof(x) + 20;
??? }
} ;
int main()
{
??? Derived stDerived;
??? Base *pstBase = &stDerived;
??? charx[10];
??? printf("%d\n", pstBase->foo(100) + pstBase->foo(x));
??? return0;
}
在32位環(huán)境下木缝,以上程序的輸出結(jié)果是?
正確答案:C??你的答案:D(錯(cuò)誤)
2000
2004
2014
2024
用父類(lèi)指針指向子類(lèi)指針時(shí)围辙,如父類(lèi)函數(shù)定義了虛函數(shù)我碟,則調(diào)用時(shí)自動(dòng)調(diào)用子類(lèi)函數(shù),否則姚建,則調(diào)用父類(lèi)函數(shù)矫俺。
sizeof一個(gè)數(shù)組名稱(chēng)的時(shí)候是計(jì)算的變量所具有的實(shí)際的字節(jié)數(shù)!掸冤!
當(dāng)你在函數(shù)A中定義一個(gè)數(shù)組(比如厘托,char str[15];),然后在該函數(shù)A中直接使用sizeof(str),那么輸出結(jié)果肯定是15;但是當(dāng)你把這個(gè)數(shù)組當(dāng)成參數(shù)傳遞給另一個(gè)函數(shù)B(假如函數(shù)B為void funB(char newstr[])贩虾,在函數(shù)B中,再次使用sizeof(newstr)沥阱,輸出的結(jié)果則為4缎罢,那么這是為什么啊考杉?策精?
原因是把數(shù)組作為函數(shù)實(shí)參傳遞時(shí),是傳地址崇棠,或者叫傳引用咽袜,這樣只是把函數(shù)A中數(shù)組str的首地址傳遞到函數(shù)B,賦值給newstr枕稀,此時(shí)newstr僅僅是一個(gè)指針询刹,保存的是數(shù)組str的首地址谜嫉,所以newstr這個(gè)指針變量就是占4個(gè)字節(jié)的內(nèi)存
5.?
正確答案:A??你的答案:B(錯(cuò)誤)
1
0
-1
-2
解析:無(wú)符號(hào)號(hào)整數(shù)和有符號(hào)整數(shù)相加,有符號(hào)整數(shù)轉(zhuǎn)化為無(wú)符號(hào)整數(shù)凹联,signed int b 變成了一個(gè)很大的數(shù)沐兰,所以a + b是>0的,選A
6.
正確答案:D??你的答案:B(錯(cuò)誤)
1蔽挠,1住闯,4,4澳淑,8比原,8
0,0杠巡,4量窘,4,4忽孽,4
0绑改,0,4,4,8磷箕,8
1菱肖,1,4或颊,4,4,4
解析:?C++標(biāo)準(zhǔn)規(guī)定類(lèi)的大小不為0耳璧,空類(lèi)的大小為1,當(dāng)類(lèi)不包含虛函數(shù)和非靜態(tài)數(shù)據(jù)成員時(shí)展箱,其對(duì)象大小也為1旨枯,所以nLenA和nLenAObject的值為1;?
? 如果在類(lèi)中聲明了虛函數(shù)(不管是1個(gè)還是多個(gè))混驰,那么在實(shí)例化對(duì)象時(shí)攀隔,編譯器會(huì)自動(dòng)在對(duì)象里安插一個(gè)指針指向虛函數(shù)表VTable,在32位機(jī)器上栖榨,一個(gè)對(duì)象會(huì)增加4個(gè)字節(jié)來(lái)存儲(chǔ)此指針昆汹,它是實(shí)現(xiàn)面向?qū)ο笾卸鄳B(tài)的關(guān)鍵。因此婴栽,LenB和nLenBObject的值為4满粗;
? ?對(duì)于普通繼承,派生類(lèi)和基類(lèi)共享虛函數(shù)指針愚争,派生類(lèi)對(duì)象的存儲(chǔ)空間=基類(lèi)存儲(chǔ)空間+派生類(lèi)特有的非static數(shù)據(jù)成員的空間映皆,由于t_classA為空類(lèi)挤聘,t_classB和t_classC共享虛函數(shù)指針,因此LenC和nLenCObject的值為4劫扒;?
7.什么函數(shù)不能聲明為虛函數(shù)檬洞?
正確答案:ABC??你的答案:C(錯(cuò)誤)
靜態(tài)成員函數(shù)
內(nèi)聯(lián)函數(shù)
構(gòu)造函數(shù)
析構(gòu)函數(shù)
解析:
1.普通函數(shù)(不能被覆蓋)?
2.友元函數(shù)(C++不支持友元函數(shù)繼承)
3.內(nèi)聯(lián)函數(shù)(編譯期間展開(kāi),虛函數(shù)是在運(yùn)行期間綁定)
4.構(gòu)造函數(shù)(沒(méi)有對(duì)象不能使用構(gòu)造函數(shù)沟饥,先有構(gòu)造函數(shù)后有虛函數(shù)添怔,虛函數(shù)是對(duì)對(duì)象的動(dòng)作)?
5.靜態(tài)成員函數(shù)(只有一份大家共享)
只需要記住可以聲明成虛函數(shù)的就行!(普通的成員函數(shù)或析構(gòu)函數(shù))
虛函數(shù)的使用原則:可以把public或protected的部分成員函數(shù)聲明為虛函數(shù)贤旷;
? ? ? ? ? ? ? ? ?C++中的析構(gòu)函數(shù)通常是虛析構(gòu)函數(shù)广料;
? ? ? ? ? ? ? ? ?構(gòu)造函數(shù)不能聲明為虛函數(shù);
? ? ? ? ? ? ? ? ?虛函數(shù)不能聲明為靜態(tài)的幼驶、全局的艾杏、友元的。