備考計算機二級 C++ 程序設計考試,選擇題是不容忽視的重要部分。
今天為大家帶來 10 道難點選擇題,聚焦繼承、多態等核心難點,助力提升解題精度。
1、有如下程序:
#include<iostream>
using namespace std;
class Base {
public:Base() { x=0; }int x;
};
class Derived : public Base {
public:Derived() { x=1; y=2; }int y;
};
int main() {Base *p=new Derived;cout<<p->x<<endl;delete p;return 0;
}
運行時的輸出結果是( )
A. 0
B. 1
C. 2
D. 不確定
答案:B
分析:p 指向 Derived 對象,x 是基類成員,Derived 構造函數將 x 設為 1,輸出 1,故選 B。
2、下列關于純虛函數的敘述中,正確的是( )
A. 純虛函數是沒有函數體的虛函數
B. 純虛函數的聲明格式為 “virtual 函數原型 = 0;”
C. 派生類必須重定義基類的純虛函數
D. 含有純虛函數的類可以創建對象
答案:B
分析:純虛函數聲明為virtual 返回類型 函數名(參數)=0;
,B 正確;A 錯誤(可以有函數體);C 錯誤(派生類可仍為抽象類);D 錯誤(不能創建對象),故選 B。
3、有如下程序:
#include<iostream>
using namespace std;
class A {
public:virtual void f() { cout<<"A"; }
};
class B : public A {
public:void f() { cout<<"B"; }
};
class C : public B {
public:void f() { cout<<"C"; }
};
void show(A a) { a.f(); }
int main() {C c;show(c);return 0;
}
運行時的輸出結果是( )
A. A
B. B
C. C
D. 編譯錯誤
答案:A
分析:show 函數參數是值傳遞(對象切片),a.f () 調用基類 A 的 f,輸出 A,故選 A。
4、下列關于虛基類的敘述中,正確的是( )
A. 虛基類的構造函數不會被調用
B. 虛基類可以解決多繼承中的二義性問題
C. 虛基類的派生類一定是虛派生
D. 虛基類不能被實例化
答案:B
分析:虛基類通過共享基類對象解決二義性,B 正確;A 錯誤(會被調用);C 錯誤(派生類可非虛派生);D 錯誤(可實例化),故選 B。
5、有如下程序:
#include<iostream>
#include<string>
using namespace std;
class Person {
public:Person(string n) : name(n) {}virtual void Print() { cout<<name; }
private:string name;
};
class Student : public Person {
public:Student(string n, int i) : Person(n), id(i) {}void Print() { Person::Print(); cout<<id; }
private:int id;
};
int main() {Person *p=new Student("Tom", 123);p->Print();delete p;return 0;
}
運行時的輸出結果是( )
A. Tom
B. 123
C. Tom123
D. 編譯錯誤
答案:C
分析:Print 是虛函數,p->Print () 調用 Student 的版本,輸出 Tom123,故選 C。
6、下列關于運算符重載的敘述中,正確的是( )
A. 重載運算符的優先級可以改變
B. 重載運算符的結合性可以改變
C. 重載運算符的操作數個數可以改變
D. 重載運算符的功能可以改變
答案:D
分析:運算符重載不改變優先級、結合性和操作數個數,僅改變功能,D 正確,故選 D。
7、有如下程序:
#include<iostream>
using namespace std;
template <class T>
class MyClass {
public:MyClass(T x) { cout<<x; }
};
int main() {MyClass<int> a(10);MyClass<double> b(3.14);return 0;
}
運行時的輸出結果是( )
A. 103.14
B. 103
C. 3.1410
D. 編譯錯誤
答案:A
分析:類模板實例化為 int 和 double 版本,分別輸出 10 和 3.14,故選 A。
8、下列關于友元函數和成員函數的敘述中,正確的是( )
A. 友元函數和成員函數都有 this 指針
B. 友元函數和成員函數都可以直接訪問類的私有成員
C. 友元函數不能被繼承,成員函數可以被繼承
D. 友元函數和成員函數的聲明位置都必須在類的公有部分
答案:C
分析:友元函數無 this 指針,A 錯誤;成員函數需權限允許,B 錯誤;C 正確;友元和成員函數可在任何部分聲明,D 錯誤,故選 C。
9、有如下程序:
#include<iostream>
using namespace std;
int main() {int a[3][3]={{1,2,3}, {4,5,6}, {7,8,9}};int (*p)[3]=a;cout<<*(*(p+1)+2)<<endl;return 0;
}
運行時的輸出結果是( )
A. 5
B. 6
C. 8
D. 9
答案:B
分析:p+1 指向第二行,*(p+1)+2 指向第二行第三列元素 6,輸出 6,故選 B。
10、下列關于動態綁定的敘述中,正確的是( )
A. 動態綁定是在編譯時確定調用的函數版本
B. 動態綁定僅適用于虛函數
C. 動態綁定需要使用對象名調用函數
D. 動態綁定可以通過非指針和引用的基類對象實現
答案:B
分析:動態綁定在運行時確定,A 錯誤;僅適用于虛函數,B 正確;需通過基類指針或引用,C、D 錯誤,故選 B。
希望這 10 道題能幫助大家對 C++ 難點知識點有更深入的理解和掌握。如果想要獲取完整版 PDF(含二級更多題目題庫)
夸克網盤分享