黑龍江企業(yè)網(wǎng)站建設(shè)公司網(wǎng)上宣傳方法有哪些
每日十問9c+±內(nèi)存模型和名稱空間
1.對于下面的情況,應(yīng)使用哪種存儲方案? a.homer 是函數(shù)的形參。
b. secret變量由兩個文件共享。
c.topsecret 變量由一個文件中的所有函數(shù)共享,但對于其他文件來說是隱藏的。 d. beencalled 記錄包含它的函數(shù)被調(diào)用的次數(shù)。習(xí)題解析:
a.函數(shù)的形參是自動變量的形式,因此 homer 變量的存儲方案是自動存儲。
b.若多個文件共享一個變量,應(yīng)當(dāng)在一個文件內(nèi)將其定義為外部變量,其存儲形式是靜態(tài)外部鏈接。在其他需要使用 secret 變量的文件中使用 extern 關(guān)鍵字聲明。
c.若 topsecret變量在一個文件內(nèi)共享且不能被其他文件訪問,應(yīng)當(dāng)使用內(nèi)部鏈接的靜態(tài)變量,或者可以在未命名的名稱空間中進(jìn)行定義。
d.函數(shù)的函數(shù)體內(nèi)定義的變量通常為自動變量,為了保存函數(shù)被調(diào)用次數(shù),beencalled需要使用本地靜態(tài)變量來實(shí)現(xiàn)這個功能。
2.using 聲明和 using 編譯指令之間有何區(qū)別?
解析:
using 聲明可以單獨(dú)使用名稱空間中某個特定的名稱,其作用域與 using 所在的聲明區(qū)域相同。using 編譯指令使名稱空間中的所有名稱可用。如果在全局中使用 using 編譯指令,將使該名稱空間中的名稱在全局可用;如果在函數(shù)定義中使用 using 編譯指令,將會在該函數(shù)中使該名稱空間可用。此外,在名稱沖突時,兩者也會有部分差異,例如,名稱空間和 using 聲明的區(qū)域存在相同的名稱,如果在該區(qū)域中使用 using 聲明導(dǎo)入名稱,則兩個名稱會發(fā)生沖突而出錯。另外,如果使用 using 編譯指令,則該區(qū)域的局部版本名稱將會隱藏名稱空間的版本。因此很多情況下認(rèn)為 using 聲明只導(dǎo)入需要的部分名稱,它在使用上比 using編譯指令要更安全。
3.重新編寫下面的代碼,避免使用 using 聲明和 using 編譯指令。
#include using namespace std; int main(){
double x;
cout<<“Enter value:”: while(!(cin>>x)){
cout<<“Bad input.Please enter a number:” cin.clear();
while(cin.get()!=‘\n’)
continue;
cout<<“Value=”<<x<<end1; return 0;
解析:
題目給定的程序代碼中主要使用了 std 名稱空間中的內(nèi)容,如果不使用 using 聲明和編譯指令,那么可以直接在 std 內(nèi)的名稱前添加作用域運(yùn)算符 std::。這里主要使用的名稱包括 cin、cout、endl,因此修改后的代碼如下。
#include int main(){
double x;
std::cout<<“Enter value:”; while(!(std::cin>>x)){
std::cout<<“Bad input.Please enter a number:”; std::cin.clear();
while(std::cin.get()!=‘\n’)
continue;
std::cout<<“Value=”<<x<<std::endl; return 0;
}
4.重新編寫下面的代碼,使之使用 using 聲明,而不是 using 編譯指令。
#include using namespace std;
int main()l
double x;
cout<<“Enter value:”; while(!(cin>>x)){
cout<<“Bad input.Please enter an umber:”; cin.clear();
while(cin.get()!=‘\n’)
continue;
cout<<“Value=”<<x<<endl;
解析:
為了使用 using 聲明替代 using 編譯指令,需要查詢當(dāng)前函數(shù)或者文件使用了哪些名稱,并依次聲明,本程序主要使用了 cin、cout、endl 這3個名字,因此要使用以下 using 聲明。
using std::cout;
using std::cin;
using std::endl;
完整代碼如下。
#include int main(){
using std::cout;
using std::cin; using std::endl;
double x;
cout<<“Enter value:”;
while(!(cin>>x)){
cout<<“Bad input.Please enter a number:”; cin.clear();
while(cin.get()!=‘\n’)
continue;
cout<<“Value=”<<x<<endl;
}
5.在一個文件中調(diào)用 average(3,6)函數(shù)時,它返回兩個int型參數(shù)的 int 型平均值;在同一個程序的另一個文件中調(diào)用時,它返回兩個 int 型參數(shù)的 double 型平均值。應(yīng)如何實(shí)現(xiàn)?
解析:
在同一個程序的不同文件中使用不同函數(shù),且由于兩個 average()函數(shù)的參數(shù)相同(即特征標(biāo)相同),因此不能重載函數(shù)。解決方案是定義不同的名稱空間,調(diào)用時使用作用域解析;或者在每個文件中包含單獨(dú)的靜態(tài)函數(shù)定義,限制其是內(nèi)部鏈接函數(shù)。
6.下面的程序由兩個文件組成,該程序顯示什么內(nèi)容?
//filel.cpp
#include
using namespace std; void other(); void another(); int x=10; int y;
int main(){
cout<<x<<endl;{
int x=4;
cout<<x<<end1; cout<<y<<endl;
other(); another();
return 0; 208有這個bau juop
:bie pnisu
void other(){ aiai:bte painu
int y=1;
cout<<“Other:”<<x<<“,”<<y<<endl;
//file2.cpp
()nien anl
#include using namespace std; extern int x; namespace{
int y=-4;}
void another(){
cout<<“another () :”<<x<<“,”<<y<<endl;
}
解析:
為了分析該程序的輸出,首先查看 main ()函數(shù)內(nèi)的語句。
cout<<x<<endl;語句輸出本文件內(nèi)外部鏈接的靜態(tài)變量 x,所以程序會輸出10。
接下來的3條語句在一個單獨(dú)的語句塊內(nèi),該語句塊中定義的x隱藏了外部鏈接的x,因此賦值后輸出 4,y值未被隱藏,這時使用外部鏈接的靜態(tài)變量y,輸出結(jié)果是初始化結(jié)果 0。
other();語句調(diào)用文件內(nèi)的函數(shù)other(),該函數(shù)內(nèi)部定義的局部變量隱藏了外部變量 y,但x依然使用外部變量 x,輸出結(jié)果為:other:10,1。
another();語句調(diào)用外部文件中的函數(shù) another(),該函數(shù)在 file2.cpp 中,該文件使用了 filel.cpp 中的x變量,但是在文件的名稱空間中定義了y=-4,因此 other()函數(shù)的x為filel.cpp 內(nèi)外部鏈接的x變量,y為 file2.cpp 內(nèi)無鏈接的變量y,輸出結(jié)果為another():10-4。
所以最終顯示如下內(nèi)容。
10
4
0
Other:10,1
another():10-4
7.下面的代碼將顯示什么內(nèi)容?#include
using namespace std;
void other();
namespace n1
{
int x=1;
}
namespace n2
{
int x=2;
}
int main(){
using namespace nl;
cout<<x<<endl;
(
int x=4;
cout<<x<<", “<<n1: :x<<”, "<<n2: :x<<endl;
}
using n2::x;
cout<<x<<endl; other();
return 0;
}
void other(){
using namespace n2;
cout<<x<<endl;
{
int x=4;
cout<<x<<“,”<<n1::x<<“,”<<n2::x<<endl;
}
using n2::x;
cout<<x<<endl;
}
解析:
為了分析該程序的輸出,首先查看 main()函數(shù)內(nèi)的語句。
● using namespace nl;
cout<<x<<endl;
在main()函數(shù)的前兩條語句中,聲明了名稱空間n1,因此第2條語句的輸出x為n1
內(nèi)定義的 x,所以輸出 1。
{
int x=4;
cout<<x<<“, “<<n1::x<<”,”<<n2::x<<endl; }
以上語句首先定義了一個語句塊,塊內(nèi)定義的變量x會隱藏其他名稱空間中的同名變量,cout 輸出語句中,通過作用域運(yùn)算符指定的名稱空間不會被塊內(nèi)的局部變量隱藏。因此輸出 4,1,2。
using n2::x; cout<<x<<endl;
以上兩條語句首先通過 using 聲明使用 n2 內(nèi)的名稱,因此 cou 輸出 2。
other( );
以上語句調(diào)用函數(shù) other()。函數(shù)內(nèi)聲明了名稱空間 n2,因此首先輸出2。
在函數(shù)內(nèi)的語句塊中,再次造成名稱的隱藏,因此輸出局部變量x和作用域運(yùn)算符修飾的 x,即輸出4,1,2。
函數(shù)最后再次使用 usingn2::x,上一個語句塊內(nèi)局部變量的生命周期結(jié)束,不會造成名稱的沖突或隱藏,因此輸出 2。
最終程序輸出以下結(jié)果。
1
4,1,2
2
2
4,1,2
2