151-160

注:以下問題的部分解析並非全部是自己原創,只是爲了便於以後複習,直接粘貼總結的答案,主要來源是七月在線中的解析部分。https://www.julyedu.com/question/selectAnalyze/kp_id/4/cate/C

1、 已知有如下的變量定義,那麼第二行的表達式的值是多少( )

int main(void)
{
int x = 3 , y = 4 , z = 5;
!(x + y) + z-1 && y + z/2;
return 0;
}
A 6
B 2
C 0
D 1

解釋:選D

&&運算符的優先級要低於算術運算符,故上式相當於
( !(x + y) + z-1 )&& (y + z/2);
運算符/的優先級要大於+的優先級,故:
(x+y) = 7
!(7) = 0
0+z-1 = 5
z/2 = 2
y+2 = 6
&&兩邊均爲真 故該表達式值爲1

2、 下列運算符函數中,肯定不屬於類Value的成員函數是( )

A Value operator/(Value);
B Value operator-(Value,Value);
C Value operator+(Value);
D Value operator*(int);

解釋:選B

上述四個選項中/ + *均爲二元運算符,- 可能是一元(負號),也可能是二元(減法)。
由於這些重載函數屬於類,故他們都有一個默認的參數this指針,其形參列表應該比實際的參數個數少1,對於 - ,其參數個數只能是0或者1。

3、 以下關於函數模板和模板函數的描述中,錯誤的是( )

A 函數模板是定義重載函數的一種工具
B 模板函數在編譯時不生成可執行代碼
C 函數模板是一組函數的樣板
D 模板函數是函數模板的一個實例

解釋:選B

函數模板是一個獨立於類型的函數,可作爲一種產生函數的特定版本。而模板函數是函數模板經實例化後生成的具體函數。對於一個具體函數,編譯時需要生成可執行代碼,故B選項錯誤。
函數模板的形式
template <class 類型參數1, class類型參數2, …>
返回值類型 模板名(形參表)
{
函數體
}
這裏的class也可以用typename替代。
編譯器由模板自動生成代碼,編譯器由模板自動生成函數的過程叫模板的實例化,由模板實例化而得到的函數稱爲模板函數。

4、 在64位系統上,定義的變量int *a[2][3]佔多少字節( )

A 8
B 16
C 32
D 48

解釋:選D

a是一個指針數組,其中有2*3個元素,每個元素均爲一個指針,在64爲系統中,指針佔8個字節,故該變量共佔48個字節。

5、下面的程序的輸出結果爲( )

#include < stdio.h >
void main(void)
{
a = 1;
unsigned int b = 10;
int ret1 = (a - b > 0);

unsigned short c = 1;
unsigned short d = 10;
int ret2 = (c - d > 0);

printf(“ret1 = %d ; ret2 = %d\n”,ret1, ret2);

}
A ret1 = 0 ; ret2 = 0
B ret1 = 0 ; ret2 = 1
C ret1 = 1 ; ret2 = 0
D ret1 = 1 ; ret2 = 1

解釋:選C

-9 對應正數的原碼爲: 00000000 00000000 00000000 00001001
\quad\quad\quad\quad\quad反碼爲: 11111111 11111111 11111111 11110110
\quad\quad\quad\quad\quad補碼爲: 11111111 11111111 11111111 11110111
故unsigned -9 = 4294967287>0爲真,ret1=1。
在計算c-d時,由於0爲int類型,c和d被隱式轉換爲int類型,c-d=-9< 0,因此ret2=0.

6、 以下程序段的輸出結果是( )

#include< iostream >
using namespace std;
class A
{
public:
A(int i )
{
cout << "A ";
}
~A() { }
};
class B
{
public:
B(int j )
{
cout << "B ";
}
~B() { }
};
class C
{
public:
C(int k )
{
cout << "C ";
}
~C() { cout << "~C "; }
};

class D : public C
{
public:
D(int i , int j , int k ) : a(i) , b(j) , C(k)
{
cout << "D ";
}
~D() { cout << "~D "; }
private:
B b;
A a;
};

int main()
{
C *pc = new D(1 , 2 , 3);
delete pc;
return 0;
}
A A B C D ~D
B A B C D ~C
C C B A D ~D
D C B A D ~C

解釋:選D

C *pc = new D(1 , 2 , 3); 父類指向子類,當創建類D的對象時,首先調用D的構造函數,在D的構造函數初始化列表中。首先調用C的構造函數,輸出C,然後用參數列表中的1,2初始化a,b,注意這裏的初始化順序之於變量a,b聲明時的順序相關,故先初始化b,調用對應的構造函數,輸出B,然後是a, 輸出A,之後執行D構造函數的函數體,輸出D,最後由於這裏的析構函數不是虛函數,故只調用父類C的析構函數,輸出~C。

7、關於運算符重載,下列說法正確的是( )

A 重載時,運算符的結合性可以改變
B 重載時,運算符的優先級可以改變
C 重載時,運算符的功能可以改變
D 重載時,運算符的操作數個數可以改變

解釋:選C

在C++中,運算符的重載指的是運算符與類結合,是對已有的運算符重新進行定義,產生新的含義。C++中的運算符除了少數幾個之外,全部可以重載,而且只能重載C++中已有的運算符。
重載之後運算符的優先級和結合性都不會改變,並且不能改變原運算符的操作對象個數,但是重載可以改變運算符的功能。

8、下面哪一個不是由標準模板庫提供的合法的哈希表( )

A hash_multiset
B hash_table
C hash_set
D hash_multimap
E hash_map

解釋:選B

標準模板庫(Standard Template Library, STL)提供了一系列組件操作,主要包括容器、迭代器、基本算法、函數對象,內存分配器和配接器六個部分。選項A hash_multiset允許集合中存在相同的元素。選項B hash_table是不合法的。選項C hash_set允許數據元素與鍵值是同一個,但是不能存入相同的元素。選項D hash_multimap允許相同的鍵值對存在。選項E hash_map在存儲鍵值對時,一個鍵只能與一個元素相互關聯。

9、 int x = 2 , y = 3 , z = 4; 則表達式!x+y>z的值爲( )

A 1
B FALSE
C TRUE
D 0

解釋:選D

在C++中,單目運算符’!’的優先級>算術運算符’+’>關係運算符’>’。因此!x=0, !x+y=3, 3>4的結果爲0。

10、 下面的程序段的輸出結果是( )

void main()
{
char *x = “abcd”;
x += 2;
cout << x;
}
A 指針變量x的地址
B 字符c的地址
C c
D cd

解釋:選D

"abcd"是字符串常量,指針x指向字符串常量的首地址。x += 2;使指針指向第2個字符(字符從0開始編號),因此輸出結果爲cd。
cout << *x; 將會只輸出c。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章