第二章 從C到C++ 課後習題
一、名詞解釋引用:所謂引用,就是給對象取一個別名,使用該別名可以存取該對象。換句話說是使新對象和原對象共用一個地址。這樣,無論對哪個對象進行修改,其實都是對同一地址的內容進行修改。因而原對象和新對象(規範的說,是對象和它的引用)總是具有相同的值。
內聯函數:內聯函數是使用inline關鍵字聲明的函數,也稱內嵌函數,它主要是解決程序的運行效率。
重載函數:重載函數指在同一個作用域內名字相同而參數不同的函數。重載函數通常用來對具有相似行爲而數據類型或數據個數 不同的操作提供—個通用的名稱。
二、填空題(1)一般情況下,用C++語言編寫的程序是由 函數 加上 類 組成的。
(2)C++有兩種註釋符號,一種是 // ,另一種是 /*......*/ 。
(3) 使用C++風格的輸人輸出,在程序中必須包含頭文件 “ iostream ”。
(4) cin 是預定義的標準輸人流對象, >> 是輸人操作符,也稱提取運算符。
(5) cout 是預定義的標準輸出流對象, << 是輸出操作符,也稱插人運算符。
(6)指針的值是它所指向那個對象的 地址值 。指針的類型是它所指向對象的 類型 。指針的內容便是它所指向對象的 值 。
(7)C++使用運算符 & 來定義一個引用,對引用的存取都是對它所引用的 對象 的存取。
(8)當一個函數調用出現在函數定義之前時,必須先用函數原型對函數進行 聲明 。
(9)C++有 值傳遞 和 引用傳遞 兩種參數傳遞機制。
(10)使用關鍵字 inline 聲明的函數稱爲內聯函數。
(11)運算符 new 用於進行動態內存分配,運算符 delete 用於釋放動態分配的內存。
(12)下面程序的輸出結果爲 x=10,y=10;
x=100,y=100 。
#include<iostream>
using namespace std;
int main()
{
int x=10, &y=x;
cout<<"x="<<x<<",y="<<y<<endl;
int *P=&y;
*p=100;
cout<<"x="<<x<<",y="<<y<<endl;
return 0;
}
三、選擇題(至少選一個,可以多選)
(1)在整型指針變量p2、p3的定義中,錯誤的是( A )。A.int pl,* p2,p3; B.int * p2,p1,* p3;
C.int pl,* p2=&p1,*p3; C.int * p2,p1,* p3=&p1;
(2)若有定義“double x x=3.14,*pp=&x x;”,則*pp等價於( C )。A.&x x B.*x x C.3.14 D.x x
(3)下面對引用的描述中( C )是錯誤的。A.引用是某個變量或對象的別名 B.建立引用時,要對它初始化
C.對引用初始化可以使用任意類型的變量 D.引用與代表的對象具有相同的地址
(4)函數沒有返回值得時候,應該選擇( A )函數類型。A.void B.int C.不確定 D.float
(5)在函數的定義格式中,下面各組成部分中,( D )是可以省略的。A.函數名 B.函數體 C.返回值類型 D.函數參數
(6) 對重載的函數來說,下面敘述不正確的是( D )。A.參數的類型不同 B.參數的順序不同
C.參數的個數不同 D.參數的個數、類型、順序都相同,但函數的返回值類型不同
(7)下列有關設置函數參數默認值的描述中,( D )是正確的。A.對設置函數參數默認值的順序沒有任何規定
B.函數具有一個參數時不能設置默認值
C.默認參數要設置在函數的原型中,而不能設置在函數的定義語句中
D.設置默認參數可使用表達式,但表達式中不可用局部變量
(8) 下面說法正確的是( BC )。A.所有函數都可以說明爲內聯函數
B.具有循環語句、switch 語句的函數不能說明爲內聯函數
C.使用內聯函數,可以加快程序執行的速度,但會增加程序代碼的大小
D.使用內聯函數,可以減小程序代碼大小,但使程序執行的速度減慢
(9)一個函數功能不太複雜,但要求被頻繁調用,應選用( A )。A.內聯函數 B.重載函數 C.遞歸函數 D.嵌套函數
(10)C++對C語言做了很多改進,下列描述中使得C語言發生了質變,即從面向過程變成面向對象的是(D )。A.增加了一些新的運算符 B.允許函數重載,並允許設置默認參數
C.規定函數說明必須用原型 D.引進了類和對象的概念
四、判斷題(1)C++程序中,不得使用沒有定義或說明的變量。 ( 對)
(2)使用const 說明常量時,可以不必指出類型。 (錯 )
(3) 引用被創建時可以用任意變量進行初始化。 (錯 )
(4)一個返回引用的調用函數可以作爲左值。 (對 )
(5)函數可以沒有參數,也可以沒有返回值。 (對 )
(6)沒有參數的兩個函數是不能重載的。 (對 )
(7)函數可設置默認參數,但不允許將一個函數的所有參數都設置爲默認參數。 (錯 )
(8)運算符new 分配的空間由運算符delete 釋放。 ( 對)
五、簡答題
(1) 名字空間的定義是什麼?
答:C++提供名字空間來防止命名的衝突。
(2)引用有何用處?
答:除獨立應用外,在C++程序中,引用的主要用途是用作函數參數和函數的返回值。
(3)比較值調用和引用調用的相同點與不同點。
答:在值傳遞機制中,作爲實參的表達式的值被複制到由對應的形參名所標識的一個對象中,作爲形參的初始值。函數體對形參的訪問、修改都是在這個標識對象上的操作,與實參無關,即數據的傳遞是單向的。使用引用作函數的參數時,調用函數的實參要用變量。實參傳遞給形參,相當於在被調用函數中使用了實參的別名。於是,在被調用函數中對形參的操作,實質是對實參的直接操作,即數據的傳遞的雙向的。
(4)內聯函數有什麼作用? 它有哪些特點?
答:內聯函數是使用inline關鍵字聲明的函數。在程序編譯時,編譯系統將程序中出現內聯函數調用的地方用函數體進行替換,進減少了程序運行的時間。
內聯函數的特點:
①遞歸函數不能定義爲內聯函數。
②內聯函數一般適合於不含有switch和while等複雜的結構且只有1~5條語句的小函數,否則編譯系統將該函數視爲普通函數。
③內聯函數只能先定義後使用,否則編譯系統也將該函數視爲普通函數。
④對內聯函數不能進行異常接口聲明。
(5)函數原型中的參數名與函數定義中的參數名以及函數調用中的函數名必須一致嗎?
答:不必一致。所有的參數時根據位置和類型而不是名字來區分的。
(6)重載函數時通過什麼來區分?
答:編譯系統是將根據函數參數的類型和個數來判斷使用哪一個函數。
六、程序分析題(寫出程序的輸出結果,並分析結果)
#include<iostream>
using namespace std;
int main()
{
int num=50;
int& ref=num;
ref=ref+10;
cout<<"num="<<num<<endl;
num=num+40;
cout<<"ref="<<ref<<endl;
return 0;
}
程序運行結果如下:
結果分析如下:
首先定義一個int類型的num,並給其賦初值爲50;然後又定義一個int類型的引用ref,並將num的值賦給它。再進行“ref=ref+10”操作是輸出的值就是50+10=60,所以輸出num的值爲60,下面“num=num+40”,這裏num的值爲上面算出的值60,所以ref的值爲60+40=100。
七、程序設計題
寫出一個完整的C++程序,使用系統函數pow(x,y)計算x^y的值,注意包含頭文件cmath。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
float x,y;
cout<< "pleace input 2 integers to x,y" <<endl;
cin>>x>>y;
float w=pow(x,y);
cout<<"w="<<w<<endl;
return 0;
}
運行結果如下: